qasida 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qasida-2.0.0/CHANGELOG.md +1163 -0
- qasida-2.0.0/LICENSE +21 -0
- qasida-2.0.0/MANIFEST.in +5 -0
- qasida-2.0.0/PKG-INFO +538 -0
- qasida-2.0.0/README.md +522 -0
- qasida-2.0.0/docs/AI_ML_ROADMAP.md +158 -0
- qasida-2.0.0/docs/BENCHMARKS.md +58 -0
- qasida-2.0.0/docs/BENCHMARKS_SAFETY.md +185 -0
- qasida-2.0.0/docs/BENCHMARKS_VS.md +76 -0
- qasida-2.0.0/docs/BOOK.md +391 -0
- qasida-2.0.0/docs/DEBUGGING.md +130 -0
- qasida-2.0.0/docs/ECOSYSTEM.md +562 -0
- qasida-2.0.0/docs/FREESTANDING.md +788 -0
- qasida-2.0.0/docs/HIGH_SCHOOL_GUIDE.md +232 -0
- qasida-2.0.0/docs/INTEGRATION.md +98 -0
- qasida-2.0.0/docs/LIBRARY_ROADMAP_100.md +244 -0
- qasida-2.0.0/docs/ML_STACK.md +218 -0
- qasida-2.0.0/docs/PLATFORMS.md +105 -0
- qasida-2.0.0/docs/STABILITY.md +53 -0
- qasida-2.0.0/docs/TOP_500_FEATURES.md +569 -0
- qasida-2.0.0/docs/TOP_500_PROGRESS.md +572 -0
- qasida-2.0.0/docs/TOUR.md +293 -0
- qasida-2.0.0/docs/WASM_STRINGS.md +118 -0
- qasida-2.0.0/docs/WIT.md +71 -0
- qasida-2.0.0/examples/allocator_demo.fg +56 -0
- qasida-2.0.0/examples/allocfail_demo.fg +30 -0
- qasida-2.0.0/examples/apps/moon-browser.fg +55 -0
- qasida-2.0.0/examples/apps/moon-code.fg +208 -0
- qasida-2.0.0/examples/apps/moon-gallery.fg +35 -0
- qasida-2.0.0/examples/apps/moon-notes.fg +233 -0
- qasida-2.0.0/examples/apps/registry_server.fg +494 -0
- qasida-2.0.0/examples/apps/todo.fg +74 -0
- qasida-2.0.0/examples/arena_demo.fg +45 -0
- qasida-2.0.0/examples/autograd_demo.fg +34 -0
- qasida-2.0.0/examples/avec_demo.fg +17 -0
- qasida-2.0.0/examples/base64_demo.fg +12 -0
- qasida-2.0.0/examples/bench_demo.fg +19 -0
- qasida-2.0.0/examples/benchmark.fg +35 -0
- qasida-2.0.0/examples/benchmark_scaling.fg +30 -0
- qasida-2.0.0/examples/big32/break.fg +13 -0
- qasida-2.0.0/examples/big32/fib.fg +11 -0
- qasida-2.0.0/examples/big32/forge_os.fg +22 -0
- qasida-2.0.0/examples/big32/hello.fg +5 -0
- qasida-2.0.0/examples/big32/loop_call.fg +14 -0
- qasida-2.0.0/examples/big32/muldiv.fg +8 -0
- qasida-2.0.0/examples/big32/sum.fg +10 -0
- qasida-2.0.0/examples/big32_float_demo.fg +28 -0
- qasida-2.0.0/examples/big32_struct_demo.fg +21 -0
- qasida-2.0.0/examples/bitset_demo.fg +15 -0
- qasida-2.0.0/examples/bloom_demo.fg +11 -0
- qasida-2.0.0/examples/break_demo.fg +35 -0
- qasida-2.0.0/examples/break_gc_demo.fg +14 -0
- qasida-2.0.0/examples/calendar_demo.fg +7 -0
- qasida-2.0.0/examples/changelog_demo.fg +7 -0
- qasida-2.0.0/examples/checksum_demo.fg +10 -0
- qasida-2.0.0/examples/circle_demo.fg +8 -0
- qasida-2.0.0/examples/cli-table_demo.fg +12 -0
- qasida-2.0.0/examples/cnn_demo.fg +148 -0
- qasida-2.0.0/examples/cnn_stacked_demo.fg +218 -0
- qasida-2.0.0/examples/color_demo.fg +10 -0
- qasida-2.0.0/examples/complex_demo.fg +10 -0
- qasida-2.0.0/examples/compress_demo.fg +8 -0
- qasida-2.0.0/examples/cone_demo.fg +8 -0
- qasida-2.0.0/examples/config_demo.fg +10 -0
- qasida-2.0.0/examples/counter_demo.fg +12 -0
- qasida-2.0.0/examples/cow_demo.fg +18 -0
- qasida-2.0.0/examples/cuboid_demo.fg +7 -0
- qasida-2.0.0/examples/cuda/README.md +42 -0
- qasida-2.0.0/examples/cylinder_demo.fg +7 -0
- qasida-2.0.0/examples/dates_rand_demo.fg +16 -0
- qasida-2.0.0/examples/db_demo.fg +12 -0
- qasida-2.0.0/examples/dbg_demo.fg +12 -0
- qasida-2.0.0/examples/dbg_helper.fg +6 -0
- qasida-2.0.0/examples/decagon_demo.fg +7 -0
- qasida-2.0.0/examples/deque_demo.fg +16 -0
- qasida-2.0.0/examples/dev_demo.fg +53 -0
- qasida-2.0.0/examples/difflib_demo.fg +10 -0
- qasida-2.0.0/examples/digitsum_demo.fg +7 -0
- qasida-2.0.0/examples/diwali_diya.fg +22 -0
- qasida-2.0.0/examples/dotenv_demo.fg +11 -0
- qasida-2.0.0/examples/drop_demo.fg +34 -0
- qasida-2.0.0/examples/ecosystem/word_stats.fg +22 -0
- qasida-2.0.0/examples/ecs_demo.fg +24 -0
- qasida-2.0.0/examples/ellipse_demo.fg +7 -0
- qasida-2.0.0/examples/email-parse_demo.fg +12 -0
- qasida-2.0.0/examples/embeddings_demo.fg +17 -0
- qasida-2.0.0/examples/enums_match.fg +24 -0
- qasida-2.0.0/examples/evalharness_demo.fg +12 -0
- qasida-2.0.0/examples/events_demo.fg +12 -0
- qasida-2.0.0/examples/factorial_demo.fg +6 -0
- qasida-2.0.0/examples/ffi_demo.fg +11 -0
- qasida-2.0.0/examples/fft_demo.fg +16 -0
- qasida-2.0.0/examples/fib_demo.fg +7 -0
- qasida-2.0.0/examples/file_and_args.fg +17 -0
- qasida-2.0.0/examples/fractions_demo.fg +12 -0
- qasida-2.0.0/examples/fuzzy_demo.fg +6 -0
- qasida-2.0.0/examples/gamedev_demo.fg +11 -0
- qasida-2.0.0/examples/gc_array_demo.fg +25 -0
- qasida-2.0.0/examples/gc_demo.fg +20 -0
- qasida-2.0.0/examples/gc_struct_demo.fg +24 -0
- qasida-2.0.0/examples/gcd_demo.fg +7 -0
- qasida-2.0.0/examples/generic_enums_demo.fg +32 -0
- qasida-2.0.0/examples/generics_demo.fg +22 -0
- qasida-2.0.0/examples/geo_demo.fg +12 -0
- qasida-2.0.0/examples/gpt_forward_demo.fg +32 -0
- qasida-2.0.0/examples/gpt_scaled.fg +147 -0
- qasida-2.0.0/examples/gpt_scaled_forward_demo.fg +32 -0
- qasida-2.0.0/examples/gpt_tinystories.fg +236 -0
- qasida-2.0.0/examples/gpt_tinystories_eval.fg +148 -0
- qasida-2.0.0/examples/gpt_tinystories_eval_nonunk.fg +92 -0
- qasida-2.0.0/examples/graph_demo.fg +13 -0
- qasida-2.0.0/examples/heap_demo.fg +15 -0
- qasida-2.0.0/examples/hello2.fg +13 -0
- qasida-2.0.0/examples/hemisphere_demo.fg +7 -0
- qasida-2.0.0/examples/heptagon_demo.fg +7 -0
- qasida-2.0.0/examples/hexagon_demo.fg +7 -0
- qasida-2.0.0/examples/histogram_demo.fg +12 -0
- qasida-2.0.0/examples/http_server_demo.fg +36 -0
- qasida-2.0.0/examples/i18n_demo.fg +10 -0
- qasida-2.0.0/examples/ical-lite_demo.fg +7 -0
- qasida-2.0.0/examples/image_demo.fg +33 -0
- qasida-2.0.0/examples/import_dedup_demo.fg +29 -0
- qasida-2.0.0/examples/imported_demo.fg +12 -0
- qasida-2.0.0/examples/imported_weights.fg +9 -0
- qasida-2.0.0/examples/inference_demo.fg +142 -0
- qasida-2.0.0/examples/inference_gpt2_demo.fg +92 -0
- qasida-2.0.0/examples/ini_demo.fg +12 -0
- qasida-2.0.0/examples/interval_demo.fg +12 -0
- qasida-2.0.0/examples/iris_pipeline_demo.fg +58 -0
- qasida-2.0.0/examples/jal_pari_demo.fg +7 -0
- qasida-2.0.0/examples/kernel_demo.fg +15 -0
- qasida-2.0.0/examples/lifetime_demo.fg +27 -0
- qasida-2.0.0/examples/lru_demo.fg +14 -0
- qasida-2.0.0/examples/map_json_demo.fg +13 -0
- qasida-2.0.0/examples/markdown_demo.fg +9 -0
- qasida-2.0.0/examples/mathex_demo.fg +8 -0
- qasida-2.0.0/examples/matrix.fg +13 -0
- qasida-2.0.0/examples/matrix2_demo.fg +12 -0
- qasida-2.0.0/examples/minmax_demo.fg +9 -0
- qasida-2.0.0/examples/ml_classical_demo.fg +115 -0
- qasida-2.0.0/examples/ml_linear_regression.fg +27 -0
- qasida-2.0.0/examples/ml_mlp_xor.fg +18 -0
- qasida-2.0.0/examples/ml_regression_trace.fg +29 -0
- qasida-2.0.0/examples/ml_train_xor.fg +72 -0
- qasida-2.0.0/examples/mmap_demo.fg +11 -0
- qasida-2.0.0/examples/mmap_grow32_demo.fg +18 -0
- qasida-2.0.0/examples/mock_demo.fg +10 -0
- qasida-2.0.0/examples/money_demo.fg +8 -0
- qasida-2.0.0/examples/move_branch_demo.fg +26 -0
- qasida-2.0.0/examples/move_demo.fg +8 -0
- qasida-2.0.0/examples/movingavg_demo.fg +12 -0
- qasida-2.0.0/examples/nested_array_demo.fg +23 -0
- qasida-2.0.0/examples/nested_array_gc.fg +11 -0
- qasida-2.0.0/examples/nlp_demo.fg +9 -0
- qasida-2.0.0/examples/nn_demo.fg +29 -0
- qasida-2.0.0/examples/nonagon_demo.fg +7 -0
- qasida-2.0.0/examples/numpy_demo.fg +15 -0
- qasida-2.0.0/examples/octagon_demo.fg +7 -0
- qasida-2.0.0/examples/octahedron_demo.fg +7 -0
- qasida-2.0.0/examples/optimization_demo.fg +8 -0
- qasida-2.0.0/examples/option_result_demo.fg +25 -0
- qasida-2.0.0/examples/os/README.md +56 -0
- qasida-2.0.0/examples/os/jalos.fg +1408 -0
- qasida-2.0.0/examples/os/kernel_accel.fg +44 -0
- qasida-2.0.0/examples/os/kernel_adc.fg +45 -0
- qasida-2.0.0/examples/os/kernel_alarm.fg +49 -0
- qasida-2.0.0/examples/os/kernel_alloc.fg +79 -0
- qasida-2.0.0/examples/os/kernel_altitude.fg +42 -0
- qasida-2.0.0/examples/os/kernel_battery.fg +49 -0
- qasida-2.0.0/examples/os/kernel_beep.fg +55 -0
- qasida-2.0.0/examples/os/kernel_ble.fg +42 -0
- qasida-2.0.0/examples/os/kernel_bootmenu.fg +68 -0
- qasida-2.0.0/examples/os/kernel_calc.fg +95 -0
- qasida-2.0.0/examples/os/kernel_calendar.fg +70 -0
- qasida-2.0.0/examples/os/kernel_clock.fg +44 -0
- qasida-2.0.0/examples/os/kernel_co2.fg +42 -0
- qasida-2.0.0/examples/os/kernel_color.fg +44 -0
- qasida-2.0.0/examples/os/kernel_compass.fg +46 -0
- qasida-2.0.0/examples/os/kernel_crc.fg +44 -0
- qasida-2.0.0/examples/os/kernel_current.fg +46 -0
- qasida-2.0.0/examples/os/kernel_disk.fg +51 -0
- qasida-2.0.0/examples/os/kernel_distance.fg +43 -0
- qasida-2.0.0/examples/os/kernel_dma.fg +53 -0
- qasida-2.0.0/examples/os/kernel_drivers.fg +263 -0
- qasida-2.0.0/examples/os/kernel_dust.fg +43 -0
- qasida-2.0.0/examples/os/kernel_ecall3.fg +80 -0
- qasida-2.0.0/examples/os/kernel_editor.fg +53 -0
- qasida-2.0.0/examples/os/kernel_eeprom.fg +46 -0
- qasida-2.0.0/examples/os/kernel_encoder.fg +46 -0
- qasida-2.0.0/examples/os/kernel_fan.fg +42 -0
- qasida-2.0.0/examples/os/kernel_fb.fg +83 -0
- qasida-2.0.0/examples/os/kernel_finder.fg +2060 -0
- qasida-2.0.0/examples/os/kernel_fingerprint.fg +50 -0
- qasida-2.0.0/examples/os/kernel_flame.fg +44 -0
- qasida-2.0.0/examples/os/kernel_flow.fg +43 -0
- qasida-2.0.0/examples/os/kernel_fm.fg +83 -0
- qasida-2.0.0/examples/os/kernel_freelist.fg +149 -0
- qasida-2.0.0/examples/os/kernel_fs.fg +190 -0
- qasida-2.0.0/examples/os/kernel_fs2.fg +255 -0
- qasida-2.0.0/examples/os/kernel_fs3.fg +100 -0
- qasida-2.0.0/examples/os/kernel_full.fg +1135 -0
- qasida-2.0.0/examples/os/kernel_full_soc2.fg +1136 -0
- qasida-2.0.0/examples/os/kernel_gas.fg +42 -0
- qasida-2.0.0/examples/os/kernel_gesture.fg +46 -0
- qasida-2.0.0/examples/os/kernel_gpio.fg +43 -0
- qasida-2.0.0/examples/os/kernel_gps.fg +42 -0
- qasida-2.0.0/examples/os/kernel_gui.fg +96 -0
- qasida-2.0.0/examples/os/kernel_gyro.fg +43 -0
- qasida-2.0.0/examples/os/kernel_hall.fg +43 -0
- qasida-2.0.0/examples/os/kernel_humidity.fg +46 -0
- qasida-2.0.0/examples/os/kernel_i2c.fg +44 -0
- qasida-2.0.0/examples/os/kernel_ipc.fg +84 -0
- qasida-2.0.0/examples/os/kernel_joystick.fg +44 -0
- qasida-2.0.0/examples/os/kernel_kbd.fg +44 -0
- qasida-2.0.0/examples/os/kernel_keypad.fg +46 -0
- qasida-2.0.0/examples/os/kernel_lcd.fg +42 -0
- qasida-2.0.0/examples/os/kernel_led.fg +39 -0
- qasida-2.0.0/examples/os/kernel_level.fg +44 -0
- qasida-2.0.0/examples/os/kernel_lifetime.fg +72 -0
- qasida-2.0.0/examples/os/kernel_lifetime2.fg +176 -0
- qasida-2.0.0/examples/os/kernel_light.fg +46 -0
- qasida-2.0.0/examples/os/kernel_loadcell.fg +47 -0
- qasida-2.0.0/examples/os/kernel_mac.fg +1682 -0
- qasida-2.0.0/examples/os/kernel_mac_interactive.fg +1846 -0
- qasida-2.0.0/examples/os/kernel_mbox.fg +48 -0
- qasida-2.0.0/examples/os/kernel_mon.fg +54 -0
- qasida-2.0.0/examples/os/kernel_motor.fg +44 -0
- qasida-2.0.0/examples/os/kernel_mouse.fg +38 -0
- qasida-2.0.0/examples/os/kernel_net.fg +210 -0
- qasida-2.0.0/examples/os/kernel_net2.fg +62 -0
- qasida-2.0.0/examples/os/kernel_netdev.fg +201 -0
- qasida-2.0.0/examples/os/kernel_netdev_soc2.fg +202 -0
- qasida-2.0.0/examples/os/kernel_notes.fg +58 -0
- qasida-2.0.0/examples/os/kernel_oled.fg +43 -0
- qasida-2.0.0/examples/os/kernel_pages.fg +68 -0
- qasida-2.0.0/examples/os/kernel_paint.fg +74 -0
- qasida-2.0.0/examples/os/kernel_ph.fg +41 -0
- qasida-2.0.0/examples/os/kernel_pipe.fg +68 -0
- qasida-2.0.0/examples/os/kernel_pir.fg +42 -0
- qasida-2.0.0/examples/os/kernel_pix.fg +248 -0
- qasida-2.0.0/examples/os/kernel_power.fg +44 -0
- qasida-2.0.0/examples/os/kernel_pressure.fg +43 -0
- qasida-2.0.0/examples/os/kernel_proc.fg +203 -0
- qasida-2.0.0/examples/os/kernel_proximity.fg +43 -0
- qasida-2.0.0/examples/os/kernel_pwm.fg +54 -0
- qasida-2.0.0/examples/os/kernel_rain.fg +43 -0
- qasida-2.0.0/examples/os/kernel_relay.fg +44 -0
- qasida-2.0.0/examples/os/kernel_rfid.fg +43 -0
- qasida-2.0.0/examples/os/kernel_ringbuf.fg +48 -0
- qasida-2.0.0/examples/os/kernel_rng.fg +51 -0
- qasida-2.0.0/examples/os/kernel_rtc.fg +46 -0
- qasida-2.0.0/examples/os/kernel_sbi_demo.fg +97 -0
- qasida-2.0.0/examples/os/kernel_sched.fg +124 -0
- qasida-2.0.0/examples/os/kernel_sched2.fg +63 -0
- qasida-2.0.0/examples/os/kernel_sdcard.fg +45 -0
- qasida-2.0.0/examples/os/kernel_sem.fg +46 -0
- qasida-2.0.0/examples/os/kernel_servo.fg +45 -0
- qasida-2.0.0/examples/os/kernel_shell.fg +252 -0
- qasida-2.0.0/examples/os/kernel_shell2.fg +81 -0
- qasida-2.0.0/examples/os/kernel_snake.fg +72 -0
- qasida-2.0.0/examples/os/kernel_soil.fg +43 -0
- qasida-2.0.0/examples/os/kernel_sound.fg +44 -0
- qasida-2.0.0/examples/os/kernel_spi.fg +46 -0
- qasida-2.0.0/examples/os/kernel_stepper.fg +46 -0
- qasida-2.0.0/examples/os/kernel_stopwatch.fg +43 -0
- qasida-2.0.0/examples/os/kernel_synth.fg +36 -0
- qasida-2.0.0/examples/os/kernel_tds.fg +42 -0
- qasida-2.0.0/examples/os/kernel_temp.fg +50 -0
- qasida-2.0.0/examples/os/kernel_term.fg +2333 -0
- qasida-2.0.0/examples/os/kernel_term_uart.fg +114 -0
- qasida-2.0.0/examples/os/kernel_tick.fg +47 -0
- qasida-2.0.0/examples/os/kernel_touch.fg +47 -0
- qasida-2.0.0/examples/os/kernel_uart16550.fg +76 -0
- qasida-2.0.0/examples/os/kernel_unified.fg +785 -0
- qasida-2.0.0/examples/os/kernel_unified_soc2.fg +786 -0
- qasida-2.0.0/examples/os/kernel_uv.fg +41 -0
- qasida-2.0.0/examples/os/kernel_vibration.fg +42 -0
- qasida-2.0.0/examples/os/kernel_voltage.fg +46 -0
- qasida-2.0.0/examples/os/kernel_watchdog.fg +48 -0
- qasida-2.0.0/examples/os/kernel_wind.fg +43 -0
- qasida-2.0.0/examples/pagination_demo.fg +9 -0
- qasida-2.0.0/examples/palindrome_demo.fg +7 -0
- qasida-2.0.0/examples/pandas_demo.fg +11 -0
- qasida-2.0.0/examples/parallelogram_demo.fg +7 -0
- qasida-2.0.0/examples/password_demo.fg +10 -0
- qasida-2.0.0/examples/pathlib_demo.fg +11 -0
- qasida-2.0.0/examples/pentagon_demo.fg +7 -0
- qasida-2.0.0/examples/physics2d_demo.fg +17 -0
- qasida-2.0.0/examples/pin_demo.fg +27 -0
- qasida-2.0.0/examples/plot_demo.fg +12 -0
- qasida-2.0.0/examples/polynomials_demo.fg +10 -0
- qasida-2.0.0/examples/prime_demo.fg +9 -0
- qasida-2.0.0/examples/prism_demo.fg +7 -0
- qasida-2.0.0/examples/profiler_demo.fg +12 -0
- qasida-2.0.0/examples/progress_demo.fg +10 -0
- qasida-2.0.0/examples/property_demo.fg +8 -0
- qasida-2.0.0/examples/py_interop/lib.fg +9 -0
- qasida-2.0.0/examples/py_interop/lib2.fg +32 -0
- qasida-2.0.0/examples/py_interop/lib3.fg +51 -0
- qasida-2.0.0/examples/pyramid_demo.fg +7 -0
- qasida-2.0.0/examples/qasida_demo.fg +6 -0
- qasida-2.0.0/examples/queue_demo.fg +12 -0
- qasida-2.0.0/examples/rag_demo.fg +9 -0
- qasida-2.0.0/examples/ratelimit_demo.fg +17 -0
- qasida-2.0.0/examples/rc_demo.fg +16 -0
- qasida-2.0.0/examples/rea_bridge.fg +48 -0
- qasida-2.0.0/examples/rect_demo.fg +8 -0
- qasida-2.0.0/examples/regex_demo.fg +52 -0
- qasida-2.0.0/examples/retry-backoff_demo.fg +10 -0
- qasida-2.0.0/examples/rhombus_demo.fg +7 -0
- qasida-2.0.0/examples/rl_demo.fg +9 -0
- qasida-2.0.0/examples/rnn_curriculum_demo.fg +160 -0
- qasida-2.0.0/examples/rnn_demo.fg +180 -0
- qasida-2.0.0/examples/scope_demo.fg +12 -0
- qasida-2.0.0/examples/score_demo.fg +8 -0
- qasida-2.0.0/examples/search_demo.fg +9 -0
- qasida-2.0.0/examples/sector_demo.fg +7 -0
- qasida-2.0.0/examples/selfhost_mini.fg +234 -0
- qasida-2.0.0/examples/semver_demo.fg +11 -0
- qasida-2.0.0/examples/set_demo.fg +14 -0
- qasida-2.0.0/examples/sklearn_demo.fg +34 -0
- qasida-2.0.0/examples/slice_demo.fg +18 -0
- qasida-2.0.0/examples/slugify_demo.fg +9 -0
- qasida-2.0.0/examples/sort_demo.fg +11 -0
- qasida-2.0.0/examples/spawn_demo.fg +10 -0
- qasida-2.0.0/examples/sphere_demo.fg +7 -0
- qasida-2.0.0/examples/sql_demo.fg +16 -0
- qasida-2.0.0/examples/stack_demo.fg +12 -0
- qasida-2.0.0/examples/statistics_demo.fg +8 -0
- qasida-2.0.0/examples/str_index_demo.fg +16 -0
- qasida-2.0.0/examples/strings_demo.fg +10 -0
- qasida-2.0.0/examples/struct_array_demo.fg +25 -0
- qasida-2.0.0/examples/struct_array_gc.fg +18 -0
- qasida-2.0.0/examples/structpush_demo.fg +18 -0
- qasida-2.0.0/examples/structs_point.fg +20 -0
- qasida-2.0.0/examples/svg_demo.fg +9 -0
- qasida-2.0.0/examples/table_demo.fg +13 -0
- qasida-2.0.0/examples/teju_special.fg +43 -0
- qasida-2.0.0/examples/tempfile_demo.fg +6 -0
- qasida-2.0.0/examples/template_demo.fg +9 -0
- qasida-2.0.0/examples/tensor_autograd_demo.fg +162 -0
- qasida-2.0.0/examples/tensor_checkpoint_demo.fg +55 -0
- qasida-2.0.0/examples/tensor_demo.fg +20 -0
- qasida-2.0.0/examples/tensor_ops2_demo.fg +119 -0
- qasida-2.0.0/examples/tetrahedron_demo.fg +7 -0
- qasida-2.0.0/examples/textwrap_demo.fg +13 -0
- qasida-2.0.0/examples/tfidf_demo.fg +11 -0
- qasida-2.0.0/examples/tgt_tinystories.fg +255 -0
- qasida-2.0.0/examples/tgt_tinystories_big.fg +259 -0
- qasida-2.0.0/examples/tgt_tinystories_scaled.fg +258 -0
- qasida-2.0.0/examples/timers_demo.fg +9 -0
- qasida-2.0.0/examples/timezone_demo.fg +10 -0
- qasida-2.0.0/examples/tiny_gpt.fg +107 -0
- qasida-2.0.0/examples/tinystories_load_demo.fg +39 -0
- qasida-2.0.0/examples/tokenizer_demo.fg +37 -0
- qasida-2.0.0/examples/toml_demo.fg +13 -0
- qasida-2.0.0/examples/torus_demo.fg +7 -0
- qasida-2.0.0/examples/tour/step01_hello.fg +4 -0
- qasida-2.0.0/examples/tour/step02_vars.fg +9 -0
- qasida-2.0.0/examples/tour/step03_flow.fg +11 -0
- qasida-2.0.0/examples/tour/step04_funcs.fg +7 -0
- qasida-2.0.0/examples/tour/step05_arrays.fg +6 -0
- qasida-2.0.0/examples/tour/step06_strings.fg +6 -0
- qasida-2.0.0/examples/tour/step07_structs.fg +9 -0
- qasida-2.0.0/examples/tour/step08_enums.fg +15 -0
- qasida-2.0.0/examples/tour/step09_scope.fg +11 -0
- qasida-2.0.0/examples/tour/step10_wasm.fg +6 -0
- qasida-2.0.0/examples/trapezoid_demo.fg +7 -0
- qasida-2.0.0/examples/triangle_demo.fg +10 -0
- qasida-2.0.0/examples/try_demo.fg +41 -0
- qasida-2.0.0/examples/units_demo.fg +8 -0
- qasida-2.0.0/examples/url_demo.fg +12 -0
- qasida-2.0.0/examples/uuid_demo.fg +9 -0
- qasida-2.0.0/examples/vec2_demo.fg +13 -0
- qasida-2.0.0/examples/vec3_demo.fg +15 -0
- qasida-2.0.0/examples/vision_demo.fg +13 -0
- qasida-2.0.0/examples/wasm/break_nested.fg +17 -0
- qasida-2.0.0/examples/wasm/fib.fg +9 -0
- qasida-2.0.0/examples/wasm/float_demo.fg +8 -0
- qasida-2.0.0/examples/wasm/str_index.fg +11 -0
- qasida-2.0.0/examples/wasm/sum.fg +9 -0
- qasida-2.0.0/examples/wasm/wit_add.fg +18 -0
- qasida-2.0.0/examples/wasm/wit_list.fg +14 -0
- qasida-2.0.0/examples/wasm_strings_demo.fg +39 -0
- qasida-2.0.0/examples/wav_demo.fg +20 -0
- qasida-2.0.0/examples/weak_demo.fg +21 -0
- qasida-2.0.0/examples/xml_demo.fg +12 -0
- qasida-2.0.0/examples/zero_free_demo.fg +24 -0
- qasida-2.0.0/forge_lang/__init__.py +4 -0
- qasida-2.0.0/forge_lang/allocfail.py +28 -0
- qasida-2.0.0/forge_lang/ast_nodes.py +345 -0
- qasida-2.0.0/forge_lang/checker.py +2680 -0
- qasida-2.0.0/forge_lang/cli.py +277 -0
- qasida-2.0.0/forge_lang/codegen.py +4377 -0
- qasida-2.0.0/forge_lang/codegen_cuda.py +94 -0
- qasida-2.0.0/forge_lang/codegen_rv.py +1492 -0
- qasida-2.0.0/forge_lang/codegen_wasm.py +992 -0
- qasida-2.0.0/forge_lang/compiler.py +234 -0
- qasida-2.0.0/forge_lang/defers.py +36 -0
- qasida-2.0.0/forge_lang/docgen.py +61 -0
- qasida-2.0.0/forge_lang/drops.py +19 -0
- qasida-2.0.0/forge_lang/errors.py +6 -0
- qasida-2.0.0/forge_lang/fixedints.py +166 -0
- qasida-2.0.0/forge_lang/generics.py +109 -0
- qasida-2.0.0/forge_lang/infer.py +391 -0
- qasida-2.0.0/forge_lang/lexer.py +175 -0
- qasida-2.0.0/forge_lang/lsp.py +173 -0
- qasida-2.0.0/forge_lang/mmaps.py +33 -0
- qasida-2.0.0/forge_lang/moves.py +29 -0
- qasida-2.0.0/forge_lang/never.py +105 -0
- qasida-2.0.0/forge_lang/opaques.py +121 -0
- qasida-2.0.0/forge_lang/parser.py +715 -0
- qasida-2.0.0/forge_lang/pins.py +29 -0
- qasida-2.0.0/forge_lang/pkg.py +462 -0
- qasida-2.0.0/forge_lang/pretty.py +276 -0
- qasida-2.0.0/forge_lang/ranges.py +68 -0
- qasida-2.0.0/forge_lang/readonly.py +109 -0
- qasida-2.0.0/forge_lang/registry_server.py +163 -0
- qasida-2.0.0/forge_lang/repl.py +125 -0
- qasida-2.0.0/forge_lang/sizedarrays.py +182 -0
- qasida-2.0.0/forge_lang/stdlib/allocator.fg +45 -0
- qasida-2.0.0/forge_lang/stdlib/arena.fg +50 -0
- qasida-2.0.0/forge_lang/stdlib/autograd.fg +182 -0
- qasida-2.0.0/forge_lang/stdlib/avec.fg +69 -0
- qasida-2.0.0/forge_lang/stdlib/base64.fg +110 -0
- qasida-2.0.0/forge_lang/stdlib/bench.fg +24 -0
- qasida-2.0.0/forge_lang/stdlib/bitset.fg +37 -0
- qasida-2.0.0/forge_lang/stdlib/bloom.fg +32 -0
- qasida-2.0.0/forge_lang/stdlib/calendar.fg +41 -0
- qasida-2.0.0/forge_lang/stdlib/changelog.fg +18 -0
- qasida-2.0.0/forge_lang/stdlib/checksum.fg +41 -0
- qasida-2.0.0/forge_lang/stdlib/circle.fg +19 -0
- qasida-2.0.0/forge_lang/stdlib/cli-table.fg +43 -0
- qasida-2.0.0/forge_lang/stdlib/cli.fg +71 -0
- qasida-2.0.0/forge_lang/stdlib/cnn.fg +98 -0
- qasida-2.0.0/forge_lang/stdlib/collections.fg +93 -0
- qasida-2.0.0/forge_lang/stdlib/color.fg +97 -0
- qasida-2.0.0/forge_lang/stdlib/complex.fg +36 -0
- qasida-2.0.0/forge_lang/stdlib/compress.fg +79 -0
- qasida-2.0.0/forge_lang/stdlib/cone.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/config.fg +56 -0
- qasida-2.0.0/forge_lang/stdlib/counter.fg +55 -0
- qasida-2.0.0/forge_lang/stdlib/cow.fg +34 -0
- qasida-2.0.0/forge_lang/stdlib/csv.fg +97 -0
- qasida-2.0.0/forge_lang/stdlib/cuboid.fg +17 -0
- qasida-2.0.0/forge_lang/stdlib/cylinder.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/dataset.fg +153 -0
- qasida-2.0.0/forge_lang/stdlib/dates.fg +59 -0
- qasida-2.0.0/forge_lang/stdlib/db.fg +70 -0
- qasida-2.0.0/forge_lang/stdlib/decagon.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/deque.fg +56 -0
- qasida-2.0.0/forge_lang/stdlib/difflib.fg +63 -0
- qasida-2.0.0/forge_lang/stdlib/digitsum.fg +22 -0
- qasida-2.0.0/forge_lang/stdlib/dotenv.fg +82 -0
- qasida-2.0.0/forge_lang/stdlib/ecs.fg +67 -0
- qasida-2.0.0/forge_lang/stdlib/ellipse.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/email-parse.fg +44 -0
- qasida-2.0.0/forge_lang/stdlib/embeddings.fg +85 -0
- qasida-2.0.0/forge_lang/stdlib/evalharness.fg +39 -0
- qasida-2.0.0/forge_lang/stdlib/events.fg +51 -0
- qasida-2.0.0/forge_lang/stdlib/factorial.fg +9 -0
- qasida-2.0.0/forge_lang/stdlib/fft.fg +121 -0
- qasida-2.0.0/forge_lang/stdlib/fib.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/fractions.fg +63 -0
- qasida-2.0.0/forge_lang/stdlib/fuzzy.fg +50 -0
- qasida-2.0.0/forge_lang/stdlib/gamedev.fg +26 -0
- qasida-2.0.0/forge_lang/stdlib/gcd.fg +14 -0
- qasida-2.0.0/forge_lang/stdlib/geo.fg +48 -0
- qasida-2.0.0/forge_lang/stdlib/gpt.fg +497 -0
- qasida-2.0.0/forge_lang/stdlib/gpt2.fg +520 -0
- qasida-2.0.0/forge_lang/stdlib/graph.fg +48 -0
- qasida-2.0.0/forge_lang/stdlib/heap.fg +72 -0
- qasida-2.0.0/forge_lang/stdlib/hemisphere.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/heptagon.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/hexagon.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/histogram.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/http_server.fg +38 -0
- qasida-2.0.0/forge_lang/stdlib/i18n.fg +34 -0
- qasida-2.0.0/forge_lang/stdlib/ical-lite.fg +55 -0
- qasida-2.0.0/forge_lang/stdlib/image.fg +151 -0
- qasida-2.0.0/forge_lang/stdlib/inference.fg +95 -0
- qasida-2.0.0/forge_lang/stdlib/inference_gpt2.fg +205 -0
- qasida-2.0.0/forge_lang/stdlib/ini.fg +79 -0
- qasida-2.0.0/forge_lang/stdlib/interval.fg +26 -0
- qasida-2.0.0/forge_lang/stdlib/json.fg +18 -0
- qasida-2.0.0/forge_lang/stdlib/lifetime.fg +60 -0
- qasida-2.0.0/forge_lang/stdlib/log.fg +51 -0
- qasida-2.0.0/forge_lang/stdlib/lru.fg +47 -0
- qasida-2.0.0/forge_lang/stdlib/map.fg +44 -0
- qasida-2.0.0/forge_lang/stdlib/markdown.fg +100 -0
- qasida-2.0.0/forge_lang/stdlib/mathex.fg +33 -0
- qasida-2.0.0/forge_lang/stdlib/matrix2.fg +18 -0
- qasida-2.0.0/forge_lang/stdlib/metrics.fg +125 -0
- qasida-2.0.0/forge_lang/stdlib/minmax.fg +37 -0
- qasida-2.0.0/forge_lang/stdlib/ml.fg +54 -0
- qasida-2.0.0/forge_lang/stdlib/ml_classical.fg +245 -0
- qasida-2.0.0/forge_lang/stdlib/mock.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/money.fg +25 -0
- qasida-2.0.0/forge_lang/stdlib/movingavg.fg +37 -0
- qasida-2.0.0/forge_lang/stdlib/nlp.fg +90 -0
- qasida-2.0.0/forge_lang/stdlib/nn.fg +510 -0
- qasida-2.0.0/forge_lang/stdlib/nonagon.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/numpy.fg +174 -0
- qasida-2.0.0/forge_lang/stdlib/octagon.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/octahedron.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/optimization.fg +46 -0
- qasida-2.0.0/forge_lang/stdlib/option.fg +23 -0
- qasida-2.0.0/forge_lang/stdlib/pagination.fg +18 -0
- qasida-2.0.0/forge_lang/stdlib/palindrome.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/pandas.fg +104 -0
- qasida-2.0.0/forge_lang/stdlib/parallelogram.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/password.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/pathlib.fg +78 -0
- qasida-2.0.0/forge_lang/stdlib/pentagon.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/physics2d.fg +41 -0
- qasida-2.0.0/forge_lang/stdlib/plot.fg +50 -0
- qasida-2.0.0/forge_lang/stdlib/polynomials.fg +59 -0
- qasida-2.0.0/forge_lang/stdlib/preprocess.fg +175 -0
- qasida-2.0.0/forge_lang/stdlib/prime.fg +21 -0
- qasida-2.0.0/forge_lang/stdlib/prism.fg +17 -0
- qasida-2.0.0/forge_lang/stdlib/profiler.fg +54 -0
- qasida-2.0.0/forge_lang/stdlib/progress.fg +28 -0
- qasida-2.0.0/forge_lang/stdlib/property.fg +29 -0
- qasida-2.0.0/forge_lang/stdlib/pyramid.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/queue.fg +31 -0
- qasida-2.0.0/forge_lang/stdlib/rag.fg +36 -0
- qasida-2.0.0/forge_lang/stdlib/rand.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/ratelimit.fg +24 -0
- qasida-2.0.0/forge_lang/stdlib/rc.fg +26 -0
- qasida-2.0.0/forge_lang/stdlib/rect.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/regex.fg +247 -0
- qasida-2.0.0/forge_lang/stdlib/result.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/retry-backoff.fg +36 -0
- qasida-2.0.0/forge_lang/stdlib/rhombus.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/rl.fg +27 -0
- qasida-2.0.0/forge_lang/stdlib/rnn.fg +161 -0
- qasida-2.0.0/forge_lang/stdlib/score.fg +33 -0
- qasida-2.0.0/forge_lang/stdlib/search.fg +27 -0
- qasida-2.0.0/forge_lang/stdlib/sector.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/semver.fg +58 -0
- qasida-2.0.0/forge_lang/stdlib/set.fg +43 -0
- qasida-2.0.0/forge_lang/stdlib/sklearn.fg +259 -0
- qasida-2.0.0/forge_lang/stdlib/slice.fg +37 -0
- qasida-2.0.0/forge_lang/stdlib/slugify.fg +124 -0
- qasida-2.0.0/forge_lang/stdlib/sort.fg +35 -0
- qasida-2.0.0/forge_lang/stdlib/sphere.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/sql.fg +152 -0
- qasida-2.0.0/forge_lang/stdlib/stack.fg +31 -0
- qasida-2.0.0/forge_lang/stdlib/statistics.fg +74 -0
- qasida-2.0.0/forge_lang/stdlib/stats.fg +78 -0
- qasida-2.0.0/forge_lang/stdlib/strings.fg +35 -0
- qasida-2.0.0/forge_lang/stdlib/svg.fg +70 -0
- qasida-2.0.0/forge_lang/stdlib/table.fg +71 -0
- qasida-2.0.0/forge_lang/stdlib/tempfile.fg +9 -0
- qasida-2.0.0/forge_lang/stdlib/template.fg +56 -0
- qasida-2.0.0/forge_lang/stdlib/tensor.fg +337 -0
- qasida-2.0.0/forge_lang/stdlib/tensor_autograd.fg +799 -0
- qasida-2.0.0/forge_lang/stdlib/test.fg +42 -0
- qasida-2.0.0/forge_lang/stdlib/tetrahedron.fg +15 -0
- qasida-2.0.0/forge_lang/stdlib/textwrap.fg +43 -0
- qasida-2.0.0/forge_lang/stdlib/tfidf.fg +55 -0
- qasida-2.0.0/forge_lang/stdlib/tgt.fg +311 -0
- qasida-2.0.0/forge_lang/stdlib/timers.fg +22 -0
- qasida-2.0.0/forge_lang/stdlib/timezone.fg +32 -0
- qasida-2.0.0/forge_lang/stdlib/tokenizer.fg +206 -0
- qasida-2.0.0/forge_lang/stdlib/toml.fg +133 -0
- qasida-2.0.0/forge_lang/stdlib/torus.fg +16 -0
- qasida-2.0.0/forge_lang/stdlib/trapezoid.fg +17 -0
- qasida-2.0.0/forge_lang/stdlib/triangle.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/units.fg +43 -0
- qasida-2.0.0/forge_lang/stdlib/url.fg +221 -0
- qasida-2.0.0/forge_lang/stdlib/uuid.fg +59 -0
- qasida-2.0.0/forge_lang/stdlib/vec2.fg +20 -0
- qasida-2.0.0/forge_lang/stdlib/vec3.fg +21 -0
- qasida-2.0.0/forge_lang/stdlib/vision.fg +55 -0
- qasida-2.0.0/forge_lang/stdlib/wav.fg +54 -0
- qasida-2.0.0/forge_lang/stdlib/xml.fg +108 -0
- qasida-2.0.0/forge_lang/traits.py +10 -0
- qasida-2.0.0/forge_lang/tuples.py +165 -0
- qasida-2.0.0/forge_lang/unions.py +136 -0
- qasida-2.0.0/forge_lang/weaks.py +31 -0
- qasida-2.0.0/forge_lang/wit.py +336 -0
- qasida-2.0.0/pyproject.toml +31 -0
- qasida-2.0.0/qasida.egg-info/PKG-INFO +538 -0
- qasida-2.0.0/qasida.egg-info/SOURCES.txt +750 -0
- qasida-2.0.0/qasida.egg-info/dependency_links.txt +1 -0
- qasida-2.0.0/qasida.egg-info/entry_points.txt +2 -0
- qasida-2.0.0/qasida.egg-info/requires.txt +4 -0
- qasida-2.0.0/qasida.egg-info/top_level.txt +1 -0
- qasida-2.0.0/setup.cfg +4 -0
- qasida-2.0.0/tests/test_alias_sized_fix.py +73 -0
- qasida-2.0.0/tests/test_aliases_v1.py +229 -0
- qasida-2.0.0/tests/test_allocator_v1.py +57 -0
- qasida-2.0.0/tests/test_allocfail_v1.py +200 -0
- qasida-2.0.0/tests/test_arena_v1.py +105 -0
- qasida-2.0.0/tests/test_avec_v1.py +82 -0
- qasida-2.0.0/tests/test_bitwise.py +186 -0
- qasida-2.0.0/tests/test_checked_casts_v1.py +140 -0
- qasida-2.0.0/tests/test_chelp_fix.py +150 -0
- qasida-2.0.0/tests/test_cow_v1.py +59 -0
- qasida-2.0.0/tests/test_defer_v1.py +154 -0
- qasida-2.0.0/tests/test_drop_v1.py +137 -0
- qasida-2.0.0/tests/test_fixedints_v1.py +200 -0
- qasida-2.0.0/tests/test_freestanding.py +218 -0
- qasida-2.0.0/tests/test_hex_literals.py +121 -0
- qasida-2.0.0/tests/test_infer_v1.py +121 -0
- qasida-2.0.0/tests/test_kernel_accel.py +45 -0
- qasida-2.0.0/tests/test_kernel_adc.py +45 -0
- qasida-2.0.0/tests/test_kernel_alarm.py +50 -0
- qasida-2.0.0/tests/test_kernel_alloc.py +70 -0
- qasida-2.0.0/tests/test_kernel_altitude.py +45 -0
- qasida-2.0.0/tests/test_kernel_battery.py +45 -0
- qasida-2.0.0/tests/test_kernel_beep.py +51 -0
- qasida-2.0.0/tests/test_kernel_ble.py +45 -0
- qasida-2.0.0/tests/test_kernel_bootmenu.py +44 -0
- qasida-2.0.0/tests/test_kernel_calc.py +44 -0
- qasida-2.0.0/tests/test_kernel_calendar.py +51 -0
- qasida-2.0.0/tests/test_kernel_clock.py +49 -0
- qasida-2.0.0/tests/test_kernel_co2.py +45 -0
- qasida-2.0.0/tests/test_kernel_color.py +45 -0
- qasida-2.0.0/tests/test_kernel_compass.py +45 -0
- qasida-2.0.0/tests/test_kernel_crc.py +45 -0
- qasida-2.0.0/tests/test_kernel_current.py +45 -0
- qasida-2.0.0/tests/test_kernel_disk.py +51 -0
- qasida-2.0.0/tests/test_kernel_distance.py +45 -0
- qasida-2.0.0/tests/test_kernel_dma.py +45 -0
- qasida-2.0.0/tests/test_kernel_drivers.py +69 -0
- qasida-2.0.0/tests/test_kernel_dust.py +45 -0
- qasida-2.0.0/tests/test_kernel_ecall3.py +54 -0
- qasida-2.0.0/tests/test_kernel_editor.py +51 -0
- qasida-2.0.0/tests/test_kernel_eeprom.py +45 -0
- qasida-2.0.0/tests/test_kernel_encoder.py +45 -0
- qasida-2.0.0/tests/test_kernel_fan.py +45 -0
- qasida-2.0.0/tests/test_kernel_fb.py +69 -0
- qasida-2.0.0/tests/test_kernel_finder.py +78 -0
- qasida-2.0.0/tests/test_kernel_fingerprint.py +45 -0
- qasida-2.0.0/tests/test_kernel_flame.py +45 -0
- qasida-2.0.0/tests/test_kernel_flow.py +45 -0
- qasida-2.0.0/tests/test_kernel_fm.py +51 -0
- qasida-2.0.0/tests/test_kernel_freelist.py +74 -0
- qasida-2.0.0/tests/test_kernel_fs.py +86 -0
- qasida-2.0.0/tests/test_kernel_fs2.py +78 -0
- qasida-2.0.0/tests/test_kernel_fs3.py +53 -0
- qasida-2.0.0/tests/test_kernel_full.py +105 -0
- qasida-2.0.0/tests/test_kernel_gas.py +45 -0
- qasida-2.0.0/tests/test_kernel_gesture.py +45 -0
- qasida-2.0.0/tests/test_kernel_gpio.py +45 -0
- qasida-2.0.0/tests/test_kernel_gps.py +45 -0
- qasida-2.0.0/tests/test_kernel_gui.py +64 -0
- qasida-2.0.0/tests/test_kernel_gyro.py +45 -0
- qasida-2.0.0/tests/test_kernel_hall.py +45 -0
- qasida-2.0.0/tests/test_kernel_humidity.py +45 -0
- qasida-2.0.0/tests/test_kernel_i2c.py +45 -0
- qasida-2.0.0/tests/test_kernel_ipc.py +53 -0
- qasida-2.0.0/tests/test_kernel_joystick.py +45 -0
- qasida-2.0.0/tests/test_kernel_kbd.py +50 -0
- qasida-2.0.0/tests/test_kernel_keypad.py +45 -0
- qasida-2.0.0/tests/test_kernel_lcd.py +45 -0
- qasida-2.0.0/tests/test_kernel_led.py +50 -0
- qasida-2.0.0/tests/test_kernel_level.py +45 -0
- qasida-2.0.0/tests/test_kernel_lifetime.py +55 -0
- qasida-2.0.0/tests/test_kernel_lifetime2.py +57 -0
- qasida-2.0.0/tests/test_kernel_light.py +45 -0
- qasida-2.0.0/tests/test_kernel_loadcell.py +45 -0
- qasida-2.0.0/tests/test_kernel_mac.py +68 -0
- qasida-2.0.0/tests/test_kernel_mac_int.py +73 -0
- qasida-2.0.0/tests/test_kernel_mbox.py +45 -0
- qasida-2.0.0/tests/test_kernel_mon.py +51 -0
- qasida-2.0.0/tests/test_kernel_motor.py +45 -0
- qasida-2.0.0/tests/test_kernel_mouse.py +50 -0
- qasida-2.0.0/tests/test_kernel_net.py +72 -0
- qasida-2.0.0/tests/test_kernel_net2.py +51 -0
- qasida-2.0.0/tests/test_kernel_netdev.py +70 -0
- qasida-2.0.0/tests/test_kernel_notes.py +51 -0
- qasida-2.0.0/tests/test_kernel_oled.py +45 -0
- qasida-2.0.0/tests/test_kernel_pages.py +49 -0
- qasida-2.0.0/tests/test_kernel_paint.py +52 -0
- qasida-2.0.0/tests/test_kernel_ph.py +45 -0
- qasida-2.0.0/tests/test_kernel_pipe.py +51 -0
- qasida-2.0.0/tests/test_kernel_pir.py +45 -0
- qasida-2.0.0/tests/test_kernel_pix.py +65 -0
- qasida-2.0.0/tests/test_kernel_power.py +45 -0
- qasida-2.0.0/tests/test_kernel_pressure.py +45 -0
- qasida-2.0.0/tests/test_kernel_proc.py +117 -0
- qasida-2.0.0/tests/test_kernel_proximity.py +45 -0
- qasida-2.0.0/tests/test_kernel_pwm.py +45 -0
- qasida-2.0.0/tests/test_kernel_rain.py +45 -0
- qasida-2.0.0/tests/test_kernel_relay.py +45 -0
- qasida-2.0.0/tests/test_kernel_rfid.py +45 -0
- qasida-2.0.0/tests/test_kernel_ringbuf.py +46 -0
- qasida-2.0.0/tests/test_kernel_rng.py +51 -0
- qasida-2.0.0/tests/test_kernel_rtc.py +51 -0
- qasida-2.0.0/tests/test_kernel_sbi_demo.py +60 -0
- qasida-2.0.0/tests/test_kernel_sched.py +100 -0
- qasida-2.0.0/tests/test_kernel_sched2.py +51 -0
- qasida-2.0.0/tests/test_kernel_sdcard.py +45 -0
- qasida-2.0.0/tests/test_kernel_sem.py +45 -0
- qasida-2.0.0/tests/test_kernel_servo.py +45 -0
- qasida-2.0.0/tests/test_kernel_shell.py +82 -0
- qasida-2.0.0/tests/test_kernel_shell2.py +44 -0
- qasida-2.0.0/tests/test_kernel_snake.py +51 -0
- qasida-2.0.0/tests/test_kernel_soil.py +45 -0
- qasida-2.0.0/tests/test_kernel_sound.py +45 -0
- qasida-2.0.0/tests/test_kernel_spi.py +45 -0
- qasida-2.0.0/tests/test_kernel_stepper.py +45 -0
- qasida-2.0.0/tests/test_kernel_stopwatch.py +50 -0
- qasida-2.0.0/tests/test_kernel_synth.py +50 -0
- qasida-2.0.0/tests/test_kernel_tds.py +45 -0
- qasida-2.0.0/tests/test_kernel_temp.py +45 -0
- qasida-2.0.0/tests/test_kernel_term.py +83 -0
- qasida-2.0.0/tests/test_kernel_term_uart.py +50 -0
- qasida-2.0.0/tests/test_kernel_tick.py +74 -0
- qasida-2.0.0/tests/test_kernel_touch.py +45 -0
- qasida-2.0.0/tests/test_kernel_uart16550.py +56 -0
- qasida-2.0.0/tests/test_kernel_uart16550_soc2.py +73 -0
- qasida-2.0.0/tests/test_kernel_unified.py +102 -0
- qasida-2.0.0/tests/test_kernel_uv.py +45 -0
- qasida-2.0.0/tests/test_kernel_vibration.py +45 -0
- qasida-2.0.0/tests/test_kernel_voltage.py +45 -0
- qasida-2.0.0/tests/test_kernel_watchdog.py +50 -0
- qasida-2.0.0/tests/test_kernel_wind.py +45 -0
- qasida-2.0.0/tests/test_lifetime_v1.py +87 -0
- qasida-2.0.0/tests/test_mmap_grow32_fix.py +154 -0
- qasida-2.0.0/tests/test_mmap_v1.py +105 -0
- qasida-2.0.0/tests/test_move_branch_field.py +161 -0
- qasida-2.0.0/tests/test_move_v1.py +88 -0
- qasida-2.0.0/tests/test_nested_empty_fix.py +113 -0
- qasida-2.0.0/tests/test_nestedpush_fix.py +146 -0
- qasida-2.0.0/tests/test_never_v1.py +146 -0
- qasida-2.0.0/tests/test_newtypes_v1.py +177 -0
- qasida-2.0.0/tests/test_opaques_v1.py +202 -0
- qasida-2.0.0/tests/test_peek_poke.py +162 -0
- qasida-2.0.0/tests/test_pin_v1.py +214 -0
- qasida-2.0.0/tests/test_proxy_connect.py +279 -0
- qasida-2.0.0/tests/test_ranges_v1.py +157 -0
- qasida-2.0.0/tests/test_rc_v1.py +80 -0
- qasida-2.0.0/tests/test_read_line.py +139 -0
- qasida-2.0.0/tests/test_readonly_v1.py +166 -0
- qasida-2.0.0/tests/test_sizedarrays_v1.py +165 -0
- qasida-2.0.0/tests/test_sizedunif_fix.py +150 -0
- qasida-2.0.0/tests/test_slice_v1.py +79 -0
- qasida-2.0.0/tests/test_struct_nested_fix.py +91 -0
- qasida-2.0.0/tests/test_structpush_fix.py +177 -0
- qasida-2.0.0/tests/test_top500_batch1.py +201 -0
- qasida-2.0.0/tests/test_traits_v1.py +176 -0
- qasida-2.0.0/tests/test_traps.py +201 -0
- qasida-2.0.0/tests/test_tuples_v1.py +169 -0
- qasida-2.0.0/tests/test_unions_v1.py +219 -0
- qasida-2.0.0/tests/test_void_v1.py +124 -0
- qasida-2.0.0/tests/test_weak_v1.py +83 -0
- qasida-2.0.0/tests/test_wrapping_v1.py +143 -0
- qasida-2.0.0/tests/test_zero_free_v1.py +257 -0
|
@@ -0,0 +1,1163 @@
|
|
|
1
|
+
# Changelog — Qasida
|
|
2
|
+
|
|
3
|
+
All notable changes are listed here. Version numbers follow
|
|
4
|
+
semantic versioning: 1.0.0 (26 Oct 2026) is the first stable
|
|
5
|
+
release — the documented language surface will not break
|
|
6
|
+
without a major version bump (see docs/STABILITY.md).
|
|
7
|
+
0.x releases were pre-stable; breaking changes were possible then.
|
|
8
|
+
|
|
9
|
+
## 2.0.0 — 7 Nov 2026
|
|
10
|
+
|
|
11
|
+
- Renamed to Qasida. The command is now `qasida`, the PyPI package is `qasida`, and the runtime error prefix is `qasida:`. The version is bumped to 2.0.0 because the command name and error prefix are breaking changes. Technical names (`forge.py`, `forge_lang`, `.fg` files, RED-MOON-) are unchanged, so existing programs keep working.
|
|
12
|
+
|
|
13
|
+
- Daily batch 7 Nov 2026 (verified, pushed 7 Nov 2026
|
|
14
|
+
14:10 IST as 210ad252, tag v1.5.0 + GitHub Release): 10 OS kernels (relay 1/4, stepper 200/120, oled
|
|
15
|
+
128/64, gps 2861/7, ble 72/2, sdcard 8192/2048, loadcell
|
|
16
|
+
512/12, color 255/128, gesture 3/94, fingerprint 97/5 —
|
|
17
|
+
each a freestanding big32 kernel with a model test:
|
|
18
|
+
exact UART transcript, halted, final memory word) and
|
|
19
|
+
10 stdlib geometry modules with demos verified by
|
|
20
|
+
`qasida run` (heptagon 100/35, octagon 125/40, nonagon
|
|
21
|
+
150/45, decagon 200/50, torus 360/360, hemisphere
|
|
22
|
+
250/225, prism 60/94, tetrahedron 64/32, octahedron
|
|
23
|
+
27/27, sector 900/9000; integer-scaled formulas, same
|
|
24
|
+
convention as pentagon/circle). Full suite PASS (log
|
|
25
|
+
forge_suite_daily_20261107_31670.log).
|
|
26
|
+
- Zeroing on free (Top-500 #35, v1, default-on):
|
|
27
|
+
every heap buffer the native runtime frees is zeroed
|
|
28
|
+
before free() — arrays, strs, read_bytes temp, HTTP
|
|
29
|
+
recv buffer, spawn thread args. No new syntax; native
|
|
30
|
+
only in v1.
|
|
31
|
+
- Pinning / immovable values (Top-500 #34, v1):
|
|
32
|
+
`pin(x);` marks an owned binding immovable for the
|
|
33
|
+
rest of its scope — any whole-value use (let, call
|
|
34
|
+
argument, return), move(x), a move of one of its
|
|
35
|
+
fields, reassignment, or push is a checker error,
|
|
36
|
+
while in-place field/index writes, scalar field
|
|
37
|
+
and element reads, len/refcount, and for-iteration
|
|
38
|
+
still work. Pinning joins path-sensitively over
|
|
39
|
+
branches, loops, and match arms (pinned on any
|
|
40
|
+
path counts after the join), like move v2; native
|
|
41
|
+
codegen emits nothing for the statement. Native
|
|
42
|
+
only; big32/WASM reject pin programs with a named
|
|
43
|
+
error. Limits (rejected with named errors): pin
|
|
44
|
+
needs a variable, not a field; pinning a struct
|
|
45
|
+
with a drop method; indexing a pinned string.
|
|
46
|
+
|
|
47
|
+
## 1.5.1 — 7 Nov 2026
|
|
48
|
+
|
|
49
|
+
- PyPI packaging rework (no language change): the
|
|
50
|
+
compiler is now a real installable package. The CLI
|
|
51
|
+
moved from forge.py into forge_lang/cli.py
|
|
52
|
+
(`qasida = "forge_lang.cli:main"`; forge.py is a
|
|
53
|
+
thin shim, `python3 forge.py ...` still works, and
|
|
54
|
+
VERSION stays importable from it). The standard
|
|
55
|
+
library moved from repo-root stdlib/ into
|
|
56
|
+
forge_lang/stdlib/ and ships as package data, so an
|
|
57
|
+
installed `qasida` finds its stdlib; the compiler
|
|
58
|
+
looks in-package first and keeps the old repo-root
|
|
59
|
+
stdlib/ as a legacy fallback. setup.py and
|
|
60
|
+
bin/qasida-pip are deleted (the old data_files
|
|
61
|
+
install under share/qasida is gone); packaging is
|
|
62
|
+
fully in pyproject.toml with the version read from
|
|
63
|
+
forge_lang/__init__.py:__version__ (single source
|
|
64
|
+
of truth). MANIFEST.in ships examples/ and docs/ in
|
|
65
|
+
the sdist. .github/workflows/release.yml builds the
|
|
66
|
+
wheel + sdist, publishes to PyPI, and creates the
|
|
67
|
+
GitHub Release on every v* tag (needs the
|
|
68
|
+
PYPI_API_TOKEN secret; the file itself cannot ride
|
|
69
|
+
the Contents-API push, it lands with a git push).
|
|
70
|
+
Docs, the CI formatter check, and the web playground
|
|
71
|
+
now point at forge_lang/stdlib/.
|
|
72
|
+
|
|
73
|
+
## 1.5.0 — 6 Nov 2026
|
|
74
|
+
|
|
75
|
+
- Allocation failure as a value (#36, 7 Nov 2026):
|
|
76
|
+
new builtin try_alloc(n: int) -> Result<[int], str>,
|
|
77
|
+
native-only in v1: Ok with a zero-initialised [int]
|
|
78
|
+
array via calloc, Err("out of memory") when calloc
|
|
79
|
+
returns NULL (verified with try_alloc(2^60) = 2^63
|
|
80
|
+
bytes), Err("bad size") for n < 0, Ok empty for
|
|
81
|
+
n == 0. Works with `?` propagation (an Err reaches
|
|
82
|
+
the caller as a Result). Requires import "result.fg";
|
|
83
|
+
big32/WASM reject it with a named error. Limits:
|
|
84
|
+
[int] only, no fallible implicit allocations, and
|
|
85
|
+
the tiny bookkeeping mallocs (refcount, error-string
|
|
86
|
+
copy) can still forge_fail — only the big calloc is
|
|
87
|
+
fallible.
|
|
88
|
+
|
|
89
|
+
- Move semantics v2 (fix track, #27 extension):
|
|
90
|
+
moves in branches and loops now work via a
|
|
91
|
+
runtime moved flag per owned variable, with
|
|
92
|
+
path-sensitive checker joins (a use after a
|
|
93
|
+
conditional move is a checker error until
|
|
94
|
+
reassignment revives the variable; a second
|
|
95
|
+
loop move fails at runtime instead of
|
|
96
|
+
transferring a freed buffer), and field moves
|
|
97
|
+
now work in straight-line code (move(s.field)
|
|
98
|
+
transfers that field; sibling fields stay
|
|
99
|
+
usable, the whole struct and the moved field
|
|
100
|
+
do not, assigning the field revives it).
|
|
101
|
+
Limits, rejected with named errors: field
|
|
102
|
+
moves in branches/loops (need per-field
|
|
103
|
+
runtime flags) and moves of for-loop
|
|
104
|
+
variables (borrowed views). Native-only;
|
|
105
|
+
big32/WASM still reject move programs.
|
|
106
|
+
|
|
107
|
+
- mmap grow + word-width access (fix track, #31
|
|
108
|
+
extension): mmap_grow(m, new_len) extends the
|
|
109
|
+
mapped file with ftruncate and remaps it under
|
|
110
|
+
the same id, returning the new length (grow-only;
|
|
111
|
+
a smaller or equal size fails with a named
|
|
112
|
+
error), and mmap_get32/mmap_set32 read and write
|
|
113
|
+
a 32-bit little-endian word at a byte offset
|
|
114
|
+
(zero-extended, like peek32; a word crossing the
|
|
115
|
+
end fails with "mmap index out of bounds").
|
|
116
|
+
Native-only; big32/WASM still reject mmap
|
|
117
|
+
programs.
|
|
118
|
+
|
|
119
|
+
- Fix: struct-array push copy-on-write (fix track):
|
|
120
|
+
the per-struct forge_<T>_push helper realloced a
|
|
121
|
+
shared buffer in place — a two-sided push read
|
|
122
|
+
a[2].x == 9 where 4 was expected and ASan reported
|
|
123
|
+
a double-free in realloc. It now detaches first,
|
|
124
|
+
mirroring the scalar helpers: fresh buffer, copy
|
|
125
|
+
slots gaining ownership of their fields each
|
|
126
|
+
(str fields deep-copied, array fields inc'd),
|
|
127
|
+
drop this holder's count on the old buffer. The
|
|
128
|
+
fix track is now complete (all 7 items).
|
|
129
|
+
|
|
130
|
+
- Daily batch 6 Nov 2026 (unpushed — push
|
|
131
|
+
authorization spent): 10 OS sensor kernels
|
|
132
|
+
(hall 512, pir 1, ph 70, tds 320, flow 12,
|
|
133
|
+
level 80, current 15, voltage 330, power 99,
|
|
134
|
+
encoder 360; each freestanding big32, exact
|
|
135
|
+
UART transcript, halts, final memory word)
|
|
136
|
+
and 10 geometry libraries (sphere, cone,
|
|
137
|
+
cylinder, pyramid, ellipse, trapezoid,
|
|
138
|
+
parallelogram, rhombus, hexagon, pentagon;
|
|
139
|
+
pure Qasida, pi ≈ 3, demos exact). Full
|
|
140
|
+
suite PASS (log forge_suite_daily_20261106_16215.log).
|
|
141
|
+
|
|
142
|
+
## 1.4.0 — 3 Nov 2026
|
|
143
|
+
|
|
144
|
+
- Fix: C-helper param-consumption audit (batch-25 follow-up):
|
|
145
|
+
write_bytes freed its array parameter while builtin callers
|
|
146
|
+
transfer no hold — a sole-holder variable died with
|
|
147
|
+
heap-use-after-free on later use, and a shared variable
|
|
148
|
+
drove its refcount below the true holder count (both
|
|
149
|
+
reproduced under ASan; batch 25 had only tested a fresh
|
|
150
|
+
literal). Native gen_expr now wraps a non-fresh array
|
|
151
|
+
argument in a temp with forge_arr_inc, exactly the
|
|
152
|
+
user-function call pattern; fresh arguments pass as-is
|
|
153
|
+
and are freed. All other str/array helpers audited clean
|
|
154
|
+
by code reading + probes (file, read/write, mmap, split,
|
|
155
|
+
join, substr, trim, parallel dot/matmul, http, refcount,
|
|
156
|
+
weak_register). Documented, not fixed here: fresh heap
|
|
157
|
+
string temps passed to a builtin and discarded leak, and
|
|
158
|
+
weak_new on a fresh temp registers an entry that never
|
|
159
|
+
dies — both need semantic follow-ups, not helper edits.
|
|
160
|
+
- Fix: type aliases inside sized-array spellings
|
|
161
|
+
now expand (the batch-12 gap: "[N; 3]" reached
|
|
162
|
+
later passes unexpanded and failed as an unknown
|
|
163
|
+
field type; expand_aliases now expands the
|
|
164
|
+
element part and keeps the literal length).
|
|
165
|
+
- Fix: nested empty array literals now work
|
|
166
|
+
(`let x: [[int]] = [[]];`, mixed `[[], [1]]`,
|
|
167
|
+
call args, assignment, tuples): the checker
|
|
168
|
+
accepts types up to `[?]` holes in
|
|
169
|
+
dynamic-array/tuple positions (never sized),
|
|
170
|
+
and infer fills literal types from context so
|
|
171
|
+
codegen never sees a hole. Bare holes and
|
|
172
|
+
genuine mismatches still error.
|
|
173
|
+
- Fix: nested arrays as struct fields now work
|
|
174
|
+
(`[[int]]` and `[Point]` fields): the typedefs
|
|
175
|
+
were collected but emitted after the struct
|
|
176
|
+
bodies, which hold array fields by value — the
|
|
177
|
+
typedef lines now precede composite bodies
|
|
178
|
+
(helpers still follow the bodies). Enum payload
|
|
179
|
+
structs with nested-array payloads remain a
|
|
180
|
+
documented residual.
|
|
181
|
+
- Fix: push to a shared nested array now
|
|
182
|
+
copies-on-write (the batch-18 gap: the inline
|
|
183
|
+
nested-array push path realloced the shared
|
|
184
|
+
buffer in place, dangling the other holders and
|
|
185
|
+
double-freeing at scope exit — reproduced as a
|
|
186
|
+
tcache double free; the path now detaches first
|
|
187
|
+
like the scalar push helpers, copying slots and
|
|
188
|
+
gaining an inner reference each, so the free
|
|
189
|
+
counts stay exact. Inner arrays stay shared by
|
|
190
|
+
reference, as elsewhere).
|
|
191
|
+
- Fix: nested sized-array literals now unify
|
|
192
|
+
(`[[1, 2], [3, 4]]` against `[[int; 2]; 2]` was
|
|
193
|
+
rejected as `[[int]]`: the sized-literal check
|
|
194
|
+
compared each element's inferred dynamic type
|
|
195
|
+
against the sized element type instead of
|
|
196
|
+
recursing; it now recurses into nested literals
|
|
197
|
+
at any depth, and under a dynamic outer array
|
|
198
|
+
with sized inner arrays, and infer assigns the
|
|
199
|
+
sized type to inner literals. Precise count
|
|
200
|
+
errors now fire at the offending level, and
|
|
201
|
+
wrong inner sizes / element types are still
|
|
202
|
+
rejected. Native only; big32/WASM keep their
|
|
203
|
+
named sized rejections).
|
|
204
|
+
- Top-500 batch 1: binary/octal literals and digit separators
|
|
205
|
+
(0b1010, 0o777, 1_000; malformed literals are compile errors)
|
|
206
|
+
and the `continue` statement (native, big32, WASM, formatter;
|
|
207
|
+
a for-loop continue still runs the increment).
|
|
208
|
+
- Top-500 batch 2: traits v1 — trait declarations, impl blocks
|
|
209
|
+
(with or without a trait), method-call syntax with static
|
|
210
|
+
dispatch, and checker-enforced trait conformance. big32 and
|
|
211
|
+
WASM reject trait programs in v1 (no struct parameters /
|
|
212
|
+
structs there yet); generic traits, trait objects, and
|
|
213
|
+
generic bounds are later slices.
|
|
214
|
+
- Top-500 batch 3: type aliases v1 — transparent `type`
|
|
215
|
+
shorthands expanded in the checker before other checking,
|
|
216
|
+
so they work on every backend for already-supported types.
|
|
217
|
+
Chains, arrays, concrete generic instantiations, struct and
|
|
218
|
+
enum aliases, and struct literals via bare-struct aliases
|
|
219
|
+
are in; aliases take no type arguments.
|
|
220
|
+
- Top-500 batch 4: wrapping arithmetic (wrapping_add/sub/mul/
|
|
221
|
+
neg, never failing, on native + big32 + WASM) and distinct
|
|
222
|
+
newtypes v1 (`newtype UserId = int;`, cast-only crossings,
|
|
223
|
+
same-newtype equality, native + big32 verified, WASM a
|
|
224
|
+
later slice).
|
|
225
|
+
- Top-500 batch 5: union types v1 — `int | str` as a tagged
|
|
226
|
+
value, wrapping at assignment/argument/return/struct-field/
|
|
227
|
+
cast sites, narrowing through match arms named by member
|
|
228
|
+
type, str-payload copy/free discipline; native verified,
|
|
229
|
+
big32/WASM reject union programs in v1. Members are the
|
|
230
|
+
four scalars in v1.
|
|
231
|
+
- Top-500 batch 6: opaque types v1 — `opaque Trait` as an
|
|
232
|
+
existential over its implementations, tag-dispatched
|
|
233
|
+
method calls/copies/frees; native verified, big32/WASM
|
|
234
|
+
reject opaque programs in v1.
|
|
235
|
+
- Top-500 batch 7: fixed-width integers v1 — i8/i16/i32/
|
|
236
|
+
u8/u16/u32/u64 as distinct scalars (i64 is int), fitting
|
|
237
|
+
literals adapt, checked arithmetic and narrowing casts,
|
|
238
|
+
struct fields; native verified, big32/WASM reject
|
|
239
|
+
fixed-width programs in v1.
|
|
240
|
+
- Top-500 batch 8: sized arrays v1 — `[T; N]` as a distinct
|
|
241
|
+
type from `[T]`, exact-count literals, push rejected,
|
|
242
|
+
index/len/iteration like dynamic arrays; native verified,
|
|
243
|
+
big32/WASM reject sized programs in v1.
|
|
244
|
+
- Top-500 batch 9: readonly views v1 — `readonly [T]` as a
|
|
245
|
+
read-only handle (index/len/iteration work, push and
|
|
246
|
+
index assignment rejected), mutable-to-view coercion
|
|
247
|
+
within the same array kind; native verified, big32/WASM
|
|
248
|
+
reject readonly programs in v1.
|
|
249
|
+
- Top-500 batch 10: never type v1 — `never` as the bottom
|
|
250
|
+
type (never functions must diverge and cannot return,
|
|
251
|
+
never values coerce to any expected type at value
|
|
252
|
+
sites, diverging bodies satisfy the return rule);
|
|
253
|
+
native verified, big32/WASM reject never programs
|
|
254
|
+
in v1.
|
|
255
|
+
- Top-500 batch 11: checked float-to-int casts v1 —
|
|
256
|
+
safe mode fails on out-of-range, NaN, or infinite
|
|
257
|
+
floats; fast mode keeps the truncating cast; WASM
|
|
258
|
+
already traps, big32 already rejects.
|
|
259
|
+
- Top-500 batch 12: tuple types v1 — `(T1, T2, ...)`
|
|
260
|
+
with owned elements, flowing through let,
|
|
261
|
+
assignment, arguments, returns, and struct fields;
|
|
262
|
+
native verified, big32/WASM reject tuple programs
|
|
263
|
+
in v1. Also: composite structs now emit in
|
|
264
|
+
dependency order (forward struct references work)
|
|
265
|
+
and the lexer treats numbers after a dot as tuple
|
|
266
|
+
indices.
|
|
267
|
+
- Top-500 batch 13: local type inference v1 — an
|
|
268
|
+
empty array literal infers its element type from
|
|
269
|
+
a later constraining use (push, assignment,
|
|
270
|
+
annotated let, call argument, return, struct
|
|
271
|
+
field, field assignment); unconstrained literals
|
|
272
|
+
fail with a clear message.
|
|
273
|
+
- Top-500 batch 14: first-class ranges v1 — lazy
|
|
274
|
+
half-open `a..b` values of type `range`, with
|
|
275
|
+
len / contains / start / end / sum methods and
|
|
276
|
+
for-loop iteration; big32/WASM reject ranges
|
|
277
|
+
in v1.
|
|
278
|
+
- Top-500 batch 15: void/unit consistency v1 —
|
|
279
|
+
void is allowed only as a function or method
|
|
280
|
+
return type; every other use fails in the
|
|
281
|
+
checker with a clear message instead of
|
|
282
|
+
invalid C. §1 Types/safety is now complete.
|
|
283
|
+
- Top-500 batch 16: defer v1 — `defer call();`
|
|
284
|
+
runs at the enclosing block's exit, LIFO,
|
|
285
|
+
including early returns, breaks, and
|
|
286
|
+
continues; loop-body defers run each
|
|
287
|
+
iteration. big32/WASM reject defer in v1.
|
|
288
|
+
- Top-500 batch 17: allocator-as-value v1 —
|
|
289
|
+
stdlib/allocator.fg, pure Qasida: one
|
|
290
|
+
Allocator struct passed explicitly to
|
|
291
|
+
functions, in bump, freelist, and arena
|
|
292
|
+
kinds; out-of-memory returns -1 as a value.
|
|
293
|
+
- Top-500 batch 18: arena allocation v1 —
|
|
294
|
+
stdlib/arena.fg, pure Qasida: a growing
|
|
295
|
+
region with mark/restore for temporary
|
|
296
|
+
allocations. Also fixed two real ownership
|
|
297
|
+
bugs: copy-on-write push on shared arrays,
|
|
298
|
+
and field-assignment ownership for array and
|
|
299
|
+
struct fields.
|
|
300
|
+
- Top-500 batch 19: reference counting v1 —
|
|
301
|
+
a `refcount` builtin plus stdlib/rc.fg:
|
|
302
|
+
shared ownership made observable, clone
|
|
303
|
+
gains a holder, last drop frees.
|
|
304
|
+
- Top-500 batch 20: weak references v1 —
|
|
305
|
+
a runtime weak table: weak_new registers
|
|
306
|
+
without gaining a holder, weak_upgrade
|
|
307
|
+
reports the current array while alive and
|
|
308
|
+
(false, []) after the last strong holder
|
|
309
|
+
drops.
|
|
310
|
+
- Top-500 batch 21: move semantics v1 —
|
|
311
|
+
move(a) transfers the one hold instead of
|
|
312
|
+
copying; the source is dead afterwards and
|
|
313
|
+
any later use is a checker error.
|
|
314
|
+
- Top-500 batch 22: copy-on-write arrays v1,
|
|
315
|
+
opt-in — stdlib/cow.fg: a Cow shares its
|
|
316
|
+
buffer until a write (shared writer gets a
|
|
317
|
+
private copy, sole holder writes in place).
|
|
318
|
+
Marked partial: language-default CoW needs
|
|
319
|
+
an explicit decision (it would break Rc's
|
|
320
|
+
shared mutation).
|
|
321
|
+
- Top-500 batch 23: stack-allocated slices v1
|
|
322
|
+
— stdlib/slice.fg: a stack header over an
|
|
323
|
+
existing array's buffer, no copy, writes
|
|
324
|
+
through, slicing composes.
|
|
325
|
+
- Top-500 batch 24: lifetime-ordered placement
|
|
326
|
+
v1 — stdlib/lifetime.fg: shorts from the
|
|
327
|
+
front, longs from the back, one reset frees
|
|
328
|
+
all shorts while longs survive.
|
|
329
|
+
- Top-500 batch 25: memory-mapped files v1 —
|
|
330
|
+
a runtime mmap table: open/get/set/close,
|
|
331
|
+
writes land in the file itself. Also fixed
|
|
332
|
+
two real leaks the demo exposed (read_bytes
|
|
333
|
+
freshness, write_bytes param consumption).
|
|
334
|
+
- Top-500 batch 26: allocator-aware collections
|
|
335
|
+
v1 — AVec over the #22 Allocator (one element
|
|
336
|
+
per slot; bump stays exhausted after a pop,
|
|
337
|
+
freelist reuses the freed slot; OOM is a
|
|
338
|
+
value). Pure Qasida. Maps are the next
|
|
339
|
+
slice, so #32 lands PARTIAL.
|
|
340
|
+
- Top-500 batch 27: destructor hooks v1 — a
|
|
341
|
+
`drop` method runs when an owned binding dies
|
|
342
|
+
(block/function end, return, break), before
|
|
343
|
+
the free, via an owned copy; the receiver
|
|
344
|
+
parameter itself never hooks (else infinite
|
|
345
|
+
recursion). Native only.
|
|
346
|
+
|
|
347
|
+
## 1.3.0 — 31 Oct 2026
|
|
348
|
+
|
|
349
|
+
- Daily batch 31 Oct 2026 (10 OS kernels + 10 libraries, all
|
|
350
|
+
verified by real runs): OS kernels, each a new freestanding
|
|
351
|
+
big32 kernel with a model test (exact UART transcript,
|
|
352
|
+
halted) — rng (LCG driver), beep (note table), rtc (HH:MM:SS
|
|
353
|
+
app), editor (type/backspace), fm (file manager), paint (8x8
|
|
354
|
+
framebuffer), mon (system monitor), bootmenu (app launcher),
|
|
355
|
+
notes (notes app), pipe (byte-stream ring IPC). Libraries,
|
|
356
|
+
each a new pure Qasida stdlib file with a demo verified by
|
|
357
|
+
`qasida run` — uuid, retry-backoff, cli-table, progress,
|
|
358
|
+
email-parse, tfidf, ical-lite, config, timers, changelog.
|
|
359
|
+
Regression suite `tests/run_tests.py` passed.
|
|
360
|
+
- Language upgrade 30 Oct 2026: `ecall3(eid, arg0, arg1) -> int`
|
|
361
|
+
(big32 only) — extension id in `a7`, arguments in `a0`/`a1`,
|
|
362
|
+
result in `a0`. Proved by `examples/os/kernel_ecall3.fg` +
|
|
363
|
+
`tests/test_kernel_ecall3.py` (exact transcript `2 / 141 / -2 /
|
|
364
|
+
DONE`, halted; the 141 proves the second argument arrives in `a1`).
|
|
365
|
+
Scope note: this is the three-register call; real SBI also uses
|
|
366
|
+
`a6` for the function id, so exact firmware-SBI calls remain a
|
|
367
|
+
future slice.
|
|
368
|
+
- Language upgrade 30 Oct 2026: hex integer literals (`0xFF`,
|
|
369
|
+
`0x10000000`, uppercase `0X` also accepted) — lexer-only, so
|
|
370
|
+
every backend and the checker see a plain int; a bare `0x` with
|
|
371
|
+
no hex digit is a compile error. Proved by
|
|
372
|
+
`tests/test_hex_literals.py` (native values + a big32 model
|
|
373
|
+
kernel using `0x10000000` as the UART address).
|
|
374
|
+
- Daily batch 30 Oct 2026 (15 libraries, all pure Qasida with a
|
|
375
|
+
demo each, verified by `qasida run`): fft (radix-2 + inverse,
|
|
376
|
+
Taylor-series twiddles), mathex (erf, gamma), textwrap,
|
|
377
|
+
difflib (LCS ratio — documented as not Python's SequenceMatcher
|
|
378
|
+
ratio), slugify, markdown-lite (to text; HTML pending),
|
|
379
|
+
toml (subset), ini, xml-lite, dotenv, pathlib (POSIX), url
|
|
380
|
+
(parse/build/encode of the reserved set), compress (RLE only;
|
|
381
|
+
Huffman/gzip pending), nlp-words (tokenize/stopwords/stem-lite),
|
|
382
|
+
i18n-lite (two-locale catalog, plural-lite). Two bugs caught by
|
|
383
|
+
the demos and fixed before push: mathex `sign` needed `mut`,
|
|
384
|
+
slugify dropped uppercase letters. No kernel sims this day: a
|
|
385
|
+
big32 diagnostic sim (privilege trace, then CSR-write trace)
|
|
386
|
+
was running, so per the daily rules the OS track is reported
|
|
387
|
+
short honestly instead of colliding with it.
|
|
388
|
+
- Daily batch 29 Oct 2026 (16 libraries, all pure Qasida with a
|
|
389
|
+
demo each, verified by `qasida run`): numpy (flat row-major
|
|
390
|
+
arrays, matmul, reductions), pandas (flat DataFrame, filter,
|
|
391
|
+
sort, means), complex, fractions, statistics (mode, quantiles,
|
|
392
|
+
IQR), checksum (crc32/fnv1a/adler32 over byte arrays),
|
|
393
|
+
base64 + hex, semver (struct API — no int-to-string builtin
|
|
394
|
+
exists yet), units, polynomials, optimization (gradient
|
|
395
|
+
descent, least squares), fuzzy (Levenshtein), calendar
|
|
396
|
+
(Zeller weekday), template ({{name}} rendering), color
|
|
397
|
+
(hex/rgb/hsl), money (integer cents). Checksums cross-checked
|
|
398
|
+
against Python; weekdays cross-checked against `date`.
|
|
399
|
+
- Daily batch 29 Oct 2026 (10 OS kernels, all freestanding big32
|
|
400
|
+
verified on the Python big32 model with exact UART transcripts
|
|
401
|
+
+ memory checks): lifetime-ordered allocator (short pool freed
|
|
402
|
+
by epoch reset, long pool survives), terminal command core
|
|
403
|
+
(prompt/echo/backspace/dispatch over UART RX — the SOC2 window
|
|
404
|
+
draw itself is still pending), shell v2 with digit arguments,
|
|
405
|
+
page bitmap allocator, IPC ring queue, priority scheduler
|
|
406
|
+
policy, filesystem v3 (delete + rename), network loopback
|
|
407
|
+
checksum, calculator app, clock app. No SOC2 vvp sims were run
|
|
408
|
+
this day: the big32 Linux continuation sim was running.
|
|
409
|
+
- Traps + firmware calls (Phase D of the freestanding track;
|
|
410
|
+
see docs/FREESTANDING.md): csr_read/csr_write/csr_set/
|
|
411
|
+
csr_clear (literal CSR numbers only), trap_handler hook
|
|
412
|
+
(mtvec + full register save/restore stub + mret), ecall(eid,
|
|
413
|
+
arg) SBI-call primitive; program end clears mtvec before
|
|
414
|
+
halting. Checkpoint is ecall-driven (the model has no timer
|
|
415
|
+
or SBI emulation) with exact UART transcript SCRTK.
|
|
416
|
+
- `--freestanding` build mode (Phase C of the freestanding
|
|
417
|
+
track; see docs/FREESTANDING.md): native builds with
|
|
418
|
+
`-nostdlib` and the program's own `_start` (raw exit_group
|
|
419
|
+
syscall, main's return value = exit code); OS needs
|
|
420
|
+
(files, sockets, threads, clock, args, print, libm, extern)
|
|
421
|
+
are clean checker errors and strings/arrays are clean
|
|
422
|
+
codegen errors; big32 runs under the same flag, WASM
|
|
423
|
+
refuses it. `fail()` halts instead of exiting.
|
|
424
|
+
- Raw memory builtins `peek32`/`poke32` (Phase B of the
|
|
425
|
+
freestanding track; see docs/FREESTANDING.md): volatile 32-bit
|
|
426
|
+
load/store through a raw address — native via volatile pointer
|
|
427
|
+
helpers, big32 via `lw`/`sw`, WASM rejects loudly. `peek32` is
|
|
428
|
+
an expression, `poke32` is statement-only like `push`; both
|
|
429
|
+
unchecked in every mode, by design. Proven by a big32 model
|
|
430
|
+
run (UART byte write, status/RX reads, RAM round-trip) in
|
|
431
|
+
`tests/test_peek_poke.py`.
|
|
432
|
+
- Bitwise operators `& | ^ << >> ~` on ints (first step toward a
|
|
433
|
+
freestanding, bare-metal-capable language; see
|
|
434
|
+
docs/FREESTANDING.md): C-like precedence, two's-complement
|
|
435
|
+
`& | ^`, wrapping `<<`, arithmetic `>>`, shift counts masked
|
|
436
|
+
(0..63 native/WASM, 0..31 big32). Native, WASM, and big32
|
|
437
|
+
backends; `tests/test_bitwise.py` covers all three plus
|
|
438
|
+
checker rejections and formatter stability.
|
|
439
|
+
|
|
440
|
+
## 1.2.0 — 27 Oct 2026
|
|
441
|
+
|
|
442
|
+
- HTTPS proxy (CONNECT) support in `http_get` (native backend):
|
|
443
|
+
`https_proxy` / `HTTPS_PROXY` (`http://[user[:pass]@]host[:port]`,
|
|
444
|
+
port defaults to 8080) now tunnels HTTPS through a plain HTTP
|
|
445
|
+
proxy with a `CONNECT host:443` handshake before the TLS
|
|
446
|
+
handshake (SNI, certificate verification, and all existing
|
|
447
|
+
failure messages unchanged); `no_proxy` / `NO_PROXY` bypasses
|
|
448
|
+
the proxy (exact, leading-dot suffix, or `*`). Other proxy
|
|
449
|
+
schemes are ignored and the connection goes direct, as before;
|
|
450
|
+
plain `http://` never uses a proxy. Tested end to end with a
|
|
451
|
+
local CONNECT proxy + local TLS server on a private CA
|
|
452
|
+
(`tests/test_proxy_connect.py`, 6/6): direct, via proxy,
|
|
453
|
+
no_proxy bypass, proxy refusal (clean "proxy CONNECT refused"
|
|
454
|
+
error), proxy auth, and non-http scheme ignored. WASM/big32
|
|
455
|
+
unaffected (native C only).
|
|
456
|
+
- Windows port (MinGW-w64, cross-compile verified, not yet
|
|
457
|
+
run-verified): the generated C now has a `#ifdef _WIN32`
|
|
458
|
+
branch — winsock headers, a `forge_sock_t` socket type
|
|
459
|
+
(`SOCKET` on Windows, `int` elsewhere), `closesocket`
|
|
460
|
+
via `forge_sock_close`, lazy `WSAStartup`, link
|
|
461
|
+
`-lws2_32`; fast mode drops `-march=native` for MinGW
|
|
462
|
+
targets. HTTPS is off by default on Windows (no MinGW
|
|
463
|
+
OpenSSL here): `https_get` compiles to a stub that
|
|
464
|
+
fails at runtime with a clear message; plain HTTP and
|
|
465
|
+
non-network programs are unaffected. Opt back in with
|
|
466
|
+
`QASIDA_HAVE_OPENSSL=1` (MSYS2 OpenSSL, untested).
|
|
467
|
+
`QASIDA_NO_OPENSSL=1` builds any platform without
|
|
468
|
+
OpenSSL (same stub). Verified: hello, HTTP registry
|
|
469
|
+
server, scope/threads, struct-array, nested-array,
|
|
470
|
+
break, and https programs all cross-compile with
|
|
471
|
+
`x86_64-w64-mingw32-gcc-posix` 13.2.0. No Wine here,
|
|
472
|
+
so no `.exe` has executed yet — Windows is not
|
|
473
|
+
claimed as supported until one runs.
|
|
474
|
+
- Registry deploy files completed (registry/): the server
|
|
475
|
+
now reads `PORT` and `FORGE_REGISTRY_TOKEN` from the
|
|
476
|
+
environment (CLI flags still win), `GET /` and
|
|
477
|
+
`GET /health` answer for health checks, and the
|
|
478
|
+
Dockerfile no longer passes an empty `--token` (which
|
|
479
|
+
used to lock publishing even in open mode). New:
|
|
480
|
+
`render.yaml` (Blueprint), `fly.toml` (with a
|
|
481
|
+
persistent volume for published packages), a systemd
|
|
482
|
+
unit for VPS installs, and a rewritten README with
|
|
483
|
+
exact steps for each. Verified live without Docker
|
|
484
|
+
(no daemon in this VM): health, empty list, publish
|
|
485
|
+
401 without token / ok with token / 409 on republish,
|
|
486
|
+
byte-exact file round-trip, and open-mode publish.
|
|
487
|
+
The Docker image itself is not built here — the
|
|
488
|
+
Dockerfile is a 10-line copy of the verified script.
|
|
489
|
+
- JalOS (examples/os/jalos.fg, ~1300 lines): a complete
|
|
490
|
+
teaching OS in Qasida — boot, priority scheduler
|
|
491
|
+
(29-tick demo: printer, counter, fibber, sorter,
|
|
492
|
+
idler), first-fit heap allocator with coalescing,
|
|
493
|
+
hierarchical VFS with permissions, users, /proc,
|
|
494
|
+
networking (real HTTP fetch), a package manager
|
|
495
|
+
that really installs registry packages over HTTPS,
|
|
496
|
+
cron/syslog services, and a ~30-command shell with
|
|
497
|
+
script-file and single-command modes. The demo tour
|
|
498
|
+
is offline, deterministic, and wired into the suite
|
|
499
|
+
as an exact-output test. Honest limits (see
|
|
500
|
+
examples/os/README.md): simulated, not bootable;
|
|
501
|
+
text shell, no GUI; plain-string passwords; no
|
|
502
|
+
persistence across shutdown; HTTPS needs direct
|
|
503
|
+
internet (proxied sandboxes break the TLS handshake
|
|
504
|
+
— the language HTTP client has no proxy CONNECT
|
|
505
|
+
yet).
|
|
506
|
+
|
|
507
|
+
## 1.1.0 — 27 Oct 2026
|
|
508
|
+
|
|
509
|
+
- Book, Tour, LSP parity, fix-ending diagnostics:
|
|
510
|
+
docs/BOOK.md rewritten as the complete current guide
|
|
511
|
+
(replacing the stale starter: WASM strings/arrays, autograd,
|
|
512
|
+
and GPU training are no longer "not yet"), docs/TOUR.md is a
|
|
513
|
+
10-step guided tour with runnable programs in
|
|
514
|
+
examples/tour/ and verified outputs, the language server now
|
|
515
|
+
completes from the checker's own keyword and builtin sets
|
|
516
|
+
(so `scope`, `break`, `http_listen`, `alloc_count`, and
|
|
517
|
+
friends can no longer drift stale) with an end-to-end stdio
|
|
518
|
+
smoke test in tests/lsp_smoke.py, and checker errors now end
|
|
519
|
+
with fixes where a fix is mechanical — did-you-mean
|
|
520
|
+
suggestions for variables, functions (including builtins),
|
|
521
|
+
types, and enum variants, int/float conversion hints
|
|
522
|
+
("convert the value with 'value as float'"), missing-return
|
|
523
|
+
and break-outside-loop fix lines, and rejection of C
|
|
524
|
+
keywords as names ("'double' is a C keyword ... rename it")
|
|
525
|
+
instead of cryptic C compiler failures.
|
|
526
|
+
- WIT-first WASM components (docs/WIT.md): `forge.py build
|
|
527
|
+
prog.fg --target wasm --wit prog.wit` (and `emit-wasm --wit`)
|
|
528
|
+
checks the program against the WIT world before generating
|
|
529
|
+
the module — every non-`main` function must be declared in
|
|
530
|
+
the world's exports with matching arity, parameter types in
|
|
531
|
+
order, and return type, or the build fails naming the
|
|
532
|
+
difference. Type mapping: int -> s64, float -> f64,
|
|
533
|
+
bool -> bool, str -> string, [T] -> list<T>. World imports
|
|
534
|
+
are rejected (the backend emits a self-contained module with
|
|
535
|
+
no imports), and `--wit` with another target is rejected
|
|
536
|
+
instead of silently ignored. This is interface-contract
|
|
537
|
+
checking, not component-model binary encoding: the emitted
|
|
538
|
+
module is still a core module (see docs/WIT.md for the
|
|
539
|
+
boundary).
|
|
540
|
+
- Structured concurrency (`scope`, native backend): a `scope {
|
|
541
|
+
... }` block joins every task spawned inside it — directly or
|
|
542
|
+
transitively by functions called from inside it — at the
|
|
543
|
+
closing brace, and on any `return` or `break` that leaves the
|
|
544
|
+
scope, so no task outlives its block. Scopes nest (an inner
|
|
545
|
+
join is never repeated by an outer join or by `main`'s
|
|
546
|
+
exit join); tasks spawned outside any scope keep the old
|
|
547
|
+
behaviour (joined at `main`'s return). `scope` is not a
|
|
548
|
+
reserved word — it is recognised only as `scope` followed by
|
|
549
|
+
`{` at statement position, so `scope` still works as an
|
|
550
|
+
ordinary variable name. On WASM and big32 a scope block runs
|
|
551
|
+
as a plain block and `spawn` inside it fails as before.
|
|
552
|
+
No results, cancellation, or channels yet: spawned functions
|
|
553
|
+
are void, and a hung task still hangs the scope that waits
|
|
554
|
+
on it.
|
|
555
|
+
- Safe-mode check elimination (native backend only, SPEC §6b):
|
|
556
|
+
duplicate checks within one statement are emitted once (the
|
|
557
|
+
repeat uses the unchecked access; the cache is per-statement
|
|
558
|
+
and cleared by any call); guard intervals skip overflow/div
|
|
559
|
+
checks proven safe by if-guards (e.g. `n - 1` after `if n < 2
|
|
560
|
+
{ return n; }`), with hull joins across arms and clearing
|
|
561
|
+
around loops and matches; string-index comparisons (`s[i] ==
|
|
562
|
+
"a"`, `s[i] == s[j]`) compare bytes directly with no
|
|
563
|
+
allocation, keeping the bounds check in safe mode. Nothing
|
|
564
|
+
observable changes: aborts and results are identical, and
|
|
565
|
+
tests pin both the eliminations (emitted-C probes) and the
|
|
566
|
+
checks that must remain (overflow after reassignment, guards
|
|
567
|
+
around loops, out-of-bounds string compares and duplicate
|
|
568
|
+
reads). WASM and big32 keep every check.
|
|
569
|
+
|
|
570
|
+
- Cost of safety published (docs/BENCHMARKS_SAFETY.md,
|
|
571
|
+
tools/bench_vs/run_safety_bench.py): safe vs fast mode on six
|
|
572
|
+
tasks, compared two ways — shipped flags (safe -O2 vs fast -O3
|
|
573
|
+
-march=native) and matched flags (both -O2, so the only
|
|
574
|
+
difference is the checks). Pure check cost: overflow-check-heavy
|
|
575
|
+
fib 2.7-3.7x, string bounds checks ~1.7x, nested bounds checks
|
|
576
|
+
~1.4x, array bounds on float work ~1.0x, loop-counter checks
|
|
577
|
+
~1.0x. The big shipped fast-mode wins (matmul 3.9-5.3x) come
|
|
578
|
+
from -O3/-march=native auto-vectorization, not from dropping
|
|
579
|
+
checks — the matched comparison proves it. Safe and fast compute
|
|
580
|
+
identical results on all six tasks. Caveat, stated in the doc:
|
|
581
|
+
this VM's timing noise moves absolute times up to ~2x between
|
|
582
|
+
runs, so ranges from two runs are reported, not single numbers.
|
|
583
|
+
|
|
584
|
+
- Registry seeded from 7 to 30 packages (all 0.1.0, each with a
|
|
585
|
+
demo with self-checks and a smoke test): percentages, loans,
|
|
586
|
+
bmi, colors, sorting, search, primes, factors, statistics,
|
|
587
|
+
grades, tax, cooking, budget, checks (Luhn, ISBN-10/13), morse,
|
|
588
|
+
textstats, speed, data, angle, fractions, vectors, matrices
|
|
589
|
+
(built on the new nested arrays), polynomials. All 30 demos
|
|
590
|
+
and 30 smokes pass (60/60); publish of all 30, list, local
|
|
591
|
+
add, and HTTP add-remote verified against a local registry
|
|
592
|
+
server with a fresh consumer. Public hosting still needs the
|
|
593
|
+
maintainer's account.
|
|
594
|
+
|
|
595
|
+
- Platforms investigated (docs/PLATFORMS.md): Linux x86_64
|
|
596
|
+
remains the verified platform. Windows cross-compilation was
|
|
597
|
+
attempted with MinGW-w64 13.2.0 and fails at the generated
|
|
598
|
+
C's POSIX socket headers — a Windows port needs a winsock
|
|
599
|
+
branch in the runtime, MinGW OpenSSL or conditional HTTPS,
|
|
600
|
+
and the -posix MinGW variant. macOS was not buildable here
|
|
601
|
+
(no SDK/clang/zig); its path is a native build with Xcode
|
|
602
|
+
tools + Homebrew OpenSSL. No macOS or Windows binary is
|
|
603
|
+
claimed. Enabler shipped: `QASIDA_CC` selects the C compiler
|
|
604
|
+
for `run`/`build`/shared-library builds (default `cc`,
|
|
605
|
+
unchanged).
|
|
606
|
+
|
|
607
|
+
- Killer app: examples/apps/registry_server.fg — a package
|
|
608
|
+
registry server written in Qasida itself, speaking the same
|
|
609
|
+
HTTP API as the Python reference server, so the real `forge
|
|
610
|
+
pkg publish-remote` / `add-remote` clients work against it.
|
|
611
|
+
Verified live: publish (incl. 401 unauthorized, 409 version
|
|
612
|
+
already exists), list, versions, files, byte-exact file
|
|
613
|
+
round-trip, and a fresh consumer installing and running two
|
|
614
|
+
packages. One real bug found and fixed along the way: the
|
|
615
|
+
first version read each request with a single recv, which
|
|
616
|
+
fails when a client sends headers and body as separate
|
|
617
|
+
writes — the server now reads until headers plus
|
|
618
|
+
Content-Length body bytes arrive. Flat on-disk layout plus
|
|
619
|
+
an index file (no directory-listing builtin); listings in
|
|
620
|
+
publish order, not sorted; ASCII-only publish bodies.
|
|
621
|
+
HTTP status reasons gained 401 Unauthorized and 409
|
|
622
|
+
Conflict.
|
|
623
|
+
|
|
624
|
+
- `break` exits the innermost `while`/`for` loop, on all three
|
|
625
|
+
backends (native, WASM, big32). Breaking frees the loop body's
|
|
626
|
+
locals, so the break path does not leak (verified: 4 allocs, 4
|
|
627
|
+
frees in examples/break_gc_demo.fg). `break` outside a loop is a
|
|
628
|
+
compile error, including inside a function called from a loop.
|
|
629
|
+
This is an addition under the stability promise, not a break:
|
|
630
|
+
no existing program used `break` as an identifier.
|
|
631
|
+
|
|
632
|
+
- String indexing: `s[i]` returns a 1-character string (byte
|
|
633
|
+
indexing), on native and WASM; safe mode aborts out of bounds,
|
|
634
|
+
fast mode skips the check. Strings stay immutable: `s[i] = ...`
|
|
635
|
+
is a compile error. Not yet on big32 (clear error for now:
|
|
636
|
+
big32 has no runtime string allocation).
|
|
637
|
+
|
|
638
|
+
- Arrays of structs (native): `[Point]` works — literals, `len`,
|
|
639
|
+
`xs[i]` (owned copy), `xs[i].field` (direct read, no leaked
|
|
640
|
+
sibling fields), `for` loops (borrowed element view), `push`,
|
|
641
|
+
index assignment (frees the old element first), and array free
|
|
642
|
+
(frees elements' owned fields: verified 1/1 array and 2/2 str
|
|
643
|
+
allocs/frees). Generic struct arrays work too. Not yet on WASM
|
|
644
|
+
or big32, which report clear errors.
|
|
645
|
+
|
|
646
|
+
- Nested arrays (native): `[[int]]` matrices — literals, `len`,
|
|
647
|
+
`m[i][j]` reads, chained `m[i][j] = v` writes, `for` loops over
|
|
648
|
+
rows, row `push` and row replacement, shared-row mutation
|
|
649
|
+
(`let row = m[i]; row[j] = v;` mutates the matrix), and
|
|
650
|
+
balanced nested frees (verified 3/3 array allocs/frees for a
|
|
651
|
+
2-row matrix, 3/3 for `[[str]]`). Triple nesting works too.
|
|
652
|
+
big32 reads nested arrays on the Python model (push remains
|
|
653
|
+
unsupported there, as for all arrays); WASM reports a clear
|
|
654
|
+
error.
|
|
655
|
+
|
|
656
|
+
## 1.0.0 — 26 Oct 2026 — "Market-ready": stability promise, live playground, HTTP server, regex, real packages, packaged extension, honest benchmarks
|
|
657
|
+
|
|
658
|
+
- Stability promise: docs/STABILITY.md — semver for real. 1.x adds,
|
|
659
|
+
never breaks; breaking changes require a major version; deprecations
|
|
660
|
+
get at least one minor release of warning. The promise covers the
|
|
661
|
+
documented language surface, stdlib APIs, the qasida CLI, and the
|
|
662
|
+
package format. It does NOT cover missing features (gaps, not breaks),
|
|
663
|
+
experimental backends (CUDA emit, big32 soft-float internals, the
|
|
664
|
+
self-host prototype), performance characteristics, or error wording.
|
|
665
|
+
- Front door: the MIT LICENSE now lives in the repo root (it was only
|
|
666
|
+
preserved on GitHub's side before). Landing page updated to 1.0.0
|
|
667
|
+
numbers. Repo rename + hosting + GitHub Pages enable remain the
|
|
668
|
+
maintainer's own clicks.
|
|
669
|
+
- Install: re-verified on a clean HOME (install.sh -> qasida 1.0.0,
|
|
670
|
+
demo runs) and a clean pip venv (qasida-pip 1.0.0). PyPI publish
|
|
671
|
+
itself still needs the maintainer's account.
|
|
672
|
+
- Live playground v2: web/playground.html is now a real editor. The
|
|
673
|
+
actual compiler runs under Pyodide (fetched from the repo's main
|
|
674
|
+
branch via jsDelivr), the user's program compiles to WebAssembly
|
|
675
|
+
in-browser, and output comes from the WASM stdout buffer. Four
|
|
676
|
+
examples (hello, fib, sum, dice-with-stdlib-import), each verified
|
|
677
|
+
end to end through the same pipeline the page uses. JS syntax-checked
|
|
678
|
+
with node --check. End-to-end run in a real browser is NOT verified
|
|
679
|
+
here (no browser run was available); the page needs one open to
|
|
680
|
+
confirm Pyodide loading. WASM-subset limits are stated on the page:
|
|
681
|
+
imports work only for subset-safe stdlib files (rand/dates verified;
|
|
682
|
+
files using split/structs/float-printing fail the whole program
|
|
683
|
+
because the backend compiles every imported function).
|
|
684
|
+
- HTTP server: six new builtins (native only) — http_listen,
|
|
685
|
+
http_accept, http_read_request, http_respond, http_respond_status,
|
|
686
|
+
http_close — plus stdlib/http_server.fg (path parsing, serve_n)
|
|
687
|
+
and examples/http_server_demo.fg (routes / -> greeting,
|
|
688
|
+
/health -> ok, else 404). Verified live: curl returned 200/200/404
|
|
689
|
+
with correct bodies and Content-Lengths, server log showed all
|
|
690
|
+
three routes, clean shutdown after 3 requests, 300 bytes total
|
|
691
|
+
(recomputed by hand: 116 + 85 + 99). Limits, stated: one request per
|
|
692
|
+
connection, single read up to 8191 bytes, no TLS, no chunked bodies,
|
|
693
|
+
IPv4 0.0.0.0. Adding a builtin touches FOUR places, not one:
|
|
694
|
+
checker types, infer types, codegen call mapping, and (for str
|
|
695
|
+
results) the fresh-string list — the first build failed on exactly
|
|
696
|
+
this (emitted `void fd`) until infer was updated.
|
|
697
|
+
- Regex: stdlib/regex.fg, a backtracking engine in pure Qasida —
|
|
698
|
+
literals, `.`, `*` `+` `?` with backtracking, classes with ranges
|
|
699
|
+
(a-z/A-Z/0-9 via alphabet-position lookup, since the language has
|
|
700
|
+
no char-to-int conversion), negation, \d \w \s, literal escapes,
|
|
701
|
+
^ $ anchors; regex_match / regex_find / regex_full_match.
|
|
702
|
+
examples/regex_demo.fg: 36 checks, all pass, including backtracking
|
|
703
|
+
(a+a on "aaa", a*ab on "aab"). NOT supported, matched literally
|
|
704
|
+
instead: groups (...) and alternation | (no closures/function
|
|
705
|
+
values to represent them). Ranges outside the three alphabets never
|
|
706
|
+
match. Worst case is exponential (classic backtracking).
|
|
707
|
+
- Registry packages: packages/ ships seven real packages, each with a
|
|
708
|
+
demo main that checks its own values and a smoke test — units,
|
|
709
|
+
money (integer-paise math, hand-built int-to-string), geometry,
|
|
710
|
+
interest (simple/compound/EMI), roman (1..3999, both directions),
|
|
711
|
+
bases (binary/octal/hex, both directions), dice (on stdlib rand).
|
|
712
|
+
Remote flow verified end to end against a local registry server:
|
|
713
|
+
all seven published, list-remote showed all seven, a fresh consumer
|
|
714
|
+
package add-remote'd units@0.1.0 and ran it (5 km = 3.10685 miles,
|
|
715
|
+
100 F = 37.7778 C). Public hosting still needs the maintainer's
|
|
716
|
+
VPS/Render/Fly account + domain + HTTPS.
|
|
717
|
+
- VS Code extension: packaged as editors/vscode/forge/forge-1.0.0.vsix
|
|
718
|
+
(verified contents: displayName "Qasida", 1.0.0,
|
|
719
|
+
publisher qasida, updated grammar). Grammar gained the missing
|
|
720
|
+
keywords (enum, extern, spawn, match) and the new builtins. The
|
|
721
|
+
extension is intentionally client-free (grammar + config); the LSP
|
|
722
|
+
server (forge.py lsp) works with any LSP client. Marketplace publish
|
|
723
|
+
needs the maintainer's publisher account.
|
|
724
|
+
- Benchmarks: docs/BENCHMARKS_VS.md + tools/bench_vs/run_bench.py —
|
|
725
|
+
same algorithm in Qasida, Python, Go, Rust, C; medians of 3;
|
|
726
|
+
results verified equal across languages. Qasida is ~31x Python
|
|
727
|
+
on fib(35), ~49x on array_sum, ~259x on matmul 128; in the compiled
|
|
728
|
+
cluster with Go/Rust/C (within ~2-4x of C, trading places with Go
|
|
729
|
+
and Rust run to run on this noisy VM). Two findings kept: (1) the
|
|
730
|
+
first loop task was deleted by Rust/C compilers (closed form),
|
|
731
|
+
which is why the task is now runtime-array data; Qasida safe
|
|
732
|
+
mode does NOT fold it (checks block it), fast mode DOES (0us) —
|
|
733
|
+
mechanism verified both ways. (2) Qasida prints floats at 6
|
|
734
|
+
significant digits, so its matmul checksum displays rounded.
|
|
735
|
+
- CI: .github/workflows/ci.yml verified current (suite + formatter
|
|
736
|
+
+ ecosystem example; node is preinstalled on ubuntu-latest, big32
|
|
737
|
+
checks are compile-only). Upload still blocked: token lacks
|
|
738
|
+
workflow scope (403, as before) — needs a token fix or a web-UI
|
|
739
|
+
upload.
|
|
740
|
+
- Gotchas found by this batch (all fixed, all verified after fixing):
|
|
741
|
+
a Qasida fn named `close` collides with libc close() in the
|
|
742
|
+
generated C; the INT_MIN literal overflows (9223372036854775808 >
|
|
743
|
+
i64 max — compute it as 0 - 9223372036854775807 - 1); args()
|
|
744
|
+
excludes the program name; the WASM backend compiles every
|
|
745
|
+
imported function, so one unsupported construct fails the import;
|
|
746
|
+
a demo file named rand.fg shadowed its own stdlib import.
|
|
747
|
+
|
|
748
|
+
## 0.7.0 — 26 Oct 2026 — "Build everything open": debugger, binary I/O + images, stacked convs, curriculum RNN, big32 structs + soft-float, WASM strings/arrays, fuzzer, big TinyStories run
|
|
749
|
+
|
|
750
|
+
- Source-level debugger: `forge.py build --debug`
|
|
751
|
+
adds `-g` and the code generator emits per-statement
|
|
752
|
+
`#line` directives naming the Qasida file (main
|
|
753
|
+
file AND imported helpers — verified with readelf's
|
|
754
|
+
line table). Without `--debug` the C has no `#line`
|
|
755
|
+
at all. Caveat: -O2 inlining merges addresses, and
|
|
756
|
+
main's prologue maps to the C file (docs/DEBUGGING.md).
|
|
757
|
+
- Binary I/O + images: new builtins `read_bytes` /
|
|
758
|
+
`write_bytes`; `stdlib/image.fg` loads PPM P3 and
|
|
759
|
+
24-bit uncompressed BMP, grayscales, saves PPM P3.
|
|
760
|
+
Verified: BMP == PPM on the same 2x2 image, gray0 =
|
|
761
|
+
0.299, gray3 = 1. PNG/JPEG NOT supported (they need
|
|
762
|
+
inflate/DCT) — stated, not hidden.
|
|
763
|
+
- Tape-native im2col (op 21) + stacked convs:
|
|
764
|
+
`cnn_conv2d_tape` lets conv layers stack. Two-conv
|
|
765
|
+
net on 8x8 cross-vs-border: 0.5 -> 1.0. Found by
|
|
766
|
+
running: lr 0.05 oscillates on the deeper net (loss
|
|
767
|
+
frozen at ln 2 with exact gradients); lr 0.01 trains
|
|
768
|
+
it. The demo documents this.
|
|
769
|
+
- Curriculum RNN: `examples/rnn_curriculum_demo.fg`
|
|
770
|
+
stages len 3 -> 5 -> 8 with weight transfer; all
|
|
771
|
+
three reach 100% held-out. The 0.6.0 len-8 wall is
|
|
772
|
+
cracked, not worked around.
|
|
773
|
+
- big32 structs: local struct variables as consecutive
|
|
774
|
+
frame slots (int/bool/str fields), field reads/writes,
|
|
775
|
+
struct copies; params/returns still rejected.
|
|
776
|
+
Verified on the Python model AND Icarus Verilog.
|
|
777
|
+
- big32 soft-float v1: float literals/vars, [float]
|
|
778
|
+
arrays, + - * via forge_fadd/forge_fmul helpers in
|
|
779
|
+
exact 27-bit integer arithmetic with
|
|
780
|
+
round-to-nearest-even. Verified: 12/12 demo checks
|
|
781
|
+
and a 60-case randomized differential test vs
|
|
782
|
+
Python float32, 60/60 on model AND Verilog. Two
|
|
783
|
+
real bugs found and fixed by that fuzzing (the
|
|
784
|
+
subtraction borrow, and the carry-shift sticky
|
|
785
|
+
fold); one test-generator bug found too (pool
|
|
786
|
+
values must be float32-rounded before computing
|
|
787
|
+
expected values). NOT yet: division, ordered
|
|
788
|
+
comparisons, float printing, int<->float casts,
|
|
789
|
+
subnormal fidelity, NaN/Inf.
|
|
790
|
+
- WASM strings + arrays: `str` and flat `[int]` /
|
|
791
|
+
`[float]` / `[bool]` / `[str]` with literals,
|
|
792
|
+
concat, `==`, len, indexing, index-assign, push
|
|
793
|
+
(realloc-by-copy), params/returns, fail/assert.
|
|
794
|
+
One exported memory, bump allocator, no free/GC.
|
|
795
|
+
Verified: demo output byte-identical to native.
|
|
796
|
+
Divergence stated in docs/WASM_STRINGS.md: push
|
|
797
|
+
through a WASM parameter DOES reach the caller
|
|
798
|
+
(native push to a parameter does not).
|
|
799
|
+
- Fuzzer: `tools/fuzz.py` — seeded valid-by-
|
|
800
|
+
construction programs, safe-vs-fast differential,
|
|
801
|
+
50/50 OK on the default run, 200/200 OK on a
|
|
802
|
+
longer run (seeds 1000-1199). No compiler bugs
|
|
803
|
+
found; corpus dir stays empty until a failure
|
|
804
|
+
appears.
|
|
805
|
+
- Big TinyStories run: 2000 stories, 150,000 words,
|
|
806
|
+
vocab 2000 (UNK 3.7%), 153,744 params, 9000 steps,
|
|
807
|
+
87.7 ms/step. Held-out ppl 2128.55 -> 651.44.
|
|
808
|
+
Honest result: much better, still NOT fluent —
|
|
809
|
+
greedy output loops on "collecting", sampled
|
|
810
|
+
output is word salad with structure. Fluent
|
|
811
|
+
generation needs far more scale, not another
|
|
812
|
+
small-model run.
|
|
813
|
+
- Correction, carried from the 0.6.0 notes: earlier
|
|
814
|
+
"wasm + big32 suites passed" claims were wrong —
|
|
815
|
+
`tests/run_tests.py` ignores CLI arguments, so
|
|
816
|
+
those runs executed the NATIVE suite twice. The
|
|
817
|
+
suite now has real checks: big32 build checks for
|
|
818
|
+
both demos and a node-based WASM output comparison
|
|
819
|
+
(skipped only when node is absent). WASM/big32
|
|
820
|
+
execution stays verified manually against node and
|
|
821
|
+
the big32 model + Verilog.
|
|
822
|
+
|
|
823
|
+
## 0.6.0 — 26 Oct 2026 — Ecosystem batch: import dedup, RNN/CNN/classical ML, preprocessing, metrics, CSV, dev libraries
|
|
824
|
+
|
|
825
|
+
Fixed (compiler, the ecosystem blocker):
|
|
826
|
+
- `forge_lang/compiler.py` `load_program` now keeps a
|
|
827
|
+
true visited set instead of clearing it on return.
|
|
828
|
+
Diamond imports used to include a shared file twice
|
|
829
|
+
and fail with "duplicate struct 'Tensor'", which
|
|
830
|
+
forced every library to avoid shared imports and
|
|
831
|
+
made libraries uncombinable. Now nn.fg +
|
|
832
|
+
tensor_autograd.fg (and any other combination)
|
|
833
|
+
compile together; verified by
|
|
834
|
+
examples/import_dedup_demo.fg (tensor loss 0.693147
|
|
835
|
+
trained one Adam step, 1.0 -> 0.99).
|
|
836
|
+
|
|
837
|
+
Added (tensor autograd, ops 17-20):
|
|
838
|
+
- t_maxpool2d, t_sigmoid, t_tanh, t_mse_loss in
|
|
839
|
+
stdlib/tensor_autograd.fg, each backward rule
|
|
840
|
+
checked against finite differences
|
|
841
|
+
(examples/tensor_ops2_demo.fg: sigmoid 6.3e-13,
|
|
842
|
+
tanh 1.2e-11, maxpool routes exactly to argmax
|
|
843
|
+
cells, other cells 0).
|
|
844
|
+
|
|
845
|
+
Added (ML libraries, all verified by demos):
|
|
846
|
+
- stdlib/rnn.fg: LSTM/GRU/plain-RNN cells on the
|
|
847
|
+
tensor tape (out-parameter idiom: cells return
|
|
848
|
+
the tape and write new state ids into an `out`
|
|
849
|
+
array; the new hidden state is also the tape's
|
|
850
|
+
last node). Demo: first-bit memory over 5 steps,
|
|
851
|
+
0.44 -> 1.0. Honest limit found by running: the
|
|
852
|
+
same task at length 8 stalls at chance from
|
|
853
|
+
random init even with forget-bias init — a known
|
|
854
|
+
LSTM optimisation difficulty, not a library bug
|
|
855
|
+
(all cell ops finite-difference checked; lengths
|
|
856
|
+
3 and 5 reach 100%).
|
|
857
|
+
- stdlib/cnn.fg: im2col conv + tape maxpool. Demo:
|
|
858
|
+
8x8 cross-vs-border with noise, 0.5 -> 1.0.
|
|
859
|
+
Limit: conv input must be raw image data (first
|
|
860
|
+
layer); stacking convs needs a tape-native
|
|
861
|
+
im2col op, documented in the file.
|
|
862
|
+
- stdlib/ml_classical.fg: logistic regression
|
|
863
|
+
(tape + inline Adam), k-NN, k-means. Demo:
|
|
864
|
+
purity 1.0, knn 1.0, logreg 1.0 on synthetic 2D.
|
|
865
|
+
- stdlib/preprocess.fg, metrics.fg, csv.fg:
|
|
866
|
+
standardisation, min-max, one-hot, deterministic
|
|
867
|
+
splits, vocab builder; accuracy, confusion,
|
|
868
|
+
precision/recall/F1, MSE/MAE/R2; plain CSV load
|
|
869
|
+
(no quoted commas). Demo: real UCI Iris
|
|
870
|
+
(data/iris.csv, 150 rows) end to end, test acc
|
|
871
|
+
0.933333, macro F1 0.937322.
|
|
872
|
+
- Tensor checkpoint demo: nn checkpoints round-trip
|
|
873
|
+
a tensor model with loss diff 0.
|
|
874
|
+
|
|
875
|
+
Added (developer libraries):
|
|
876
|
+
- stdlib/test.fg, log.fg, cli.fg, collections.fg
|
|
877
|
+
(checks, leveled logging, CLI parsing, stacks
|
|
878
|
+
and sets), exercised in examples/dev_demo.fg.
|
|
879
|
+
|
|
880
|
+
Docs: docs/ECOSYSTEM.md 0.6.0 section (library
|
|
881
|
+
table, first-ML-project walkthrough, honest
|
|
882
|
+
limits). README Ecosystem section updated.
|
|
883
|
+
|
|
884
|
+
Still NOT done: fluent generation, GPU training
|
|
885
|
+
run (code only), WASM strings/arrays, big32
|
|
886
|
+
floats/structs, source-level debugger, self-hosting
|
|
887
|
+
compiler, registry host, CI upload, repo rename,
|
|
888
|
+
PyPI publish, image/binary data loading, conv
|
|
889
|
+
stacking, long-horizon RNN training.
|
|
890
|
+
|
|
891
|
+
## 0.5.0 — 26 Oct 2026 — Engine batch: tape freeing, tensor autograd, KV-cache, scaled training
|
|
892
|
+
|
|
893
|
+
Fixed (compiler, the 0.4.0 leak):
|
|
894
|
+
- `forge_lang/codegen.py` now frees a block's variables
|
|
895
|
+
when the block ends (`emit_free_frame`, applied to
|
|
896
|
+
Block, If arms, While and For bodies). Before this,
|
|
897
|
+
every array or struct created inside a loop body leaked
|
|
898
|
+
once per iteration — measured on a tape loop: 1,000
|
|
899
|
+
arrays allocated, 0 freed. After: 1,000 allocated,
|
|
900
|
+
1,000 freed, and the scalar TinyStories program trains
|
|
901
|
+
all 3 epochs in ONE process (previously OOM-killed
|
|
902
|
+
twice). A subtlety found while fixing: Assign re-adds
|
|
903
|
+
its target to the current frame even when declared
|
|
904
|
+
outside it, so a frame frees only names absent from
|
|
905
|
+
outer frames — otherwise the same value is freed twice
|
|
906
|
+
(caught by a double-free in testing, fixed before ship).
|
|
907
|
+
- `examples/gpt_tinystories.fg` now trains 3 epochs in one
|
|
908
|
+
process by default (resume still works). Single-process
|
|
909
|
+
run 26 Oct 2026: train losses 4.98375, 4.49469, 4.41384;
|
|
910
|
+
held-out loss 6.98368 -> 5.95341, perplexity 1078.88 ->
|
|
911
|
+
385.06. Note: this differs from 0.4.0's 247.39 because
|
|
912
|
+
the old split-process runs reset Adam's moments every
|
|
913
|
+
epoch — an accidental regulariser. The new number is
|
|
914
|
+
the methodologically cleaner one; both are recorded.
|
|
915
|
+
|
|
916
|
+
Added (tensor autograd):
|
|
917
|
+
- `stdlib/tensor_autograd.fg` — a tensor-level tape: one
|
|
918
|
+
node per tensor op (matmul, add, bias, transpose,
|
|
919
|
+
softmax, causal softmax, GELU, layernorm, mul, scale,
|
|
920
|
+
gather, cross-entropy, ReLU, col-slice, concat-cols,
|
|
921
|
+
reshape), with exact backward rules. Every rule is
|
|
922
|
+
checked against central finite differences in
|
|
923
|
+
`examples/tensor_autograd_demo.fg` (all diffs ~1e-9,
|
|
924
|
+
and the demo fails itself if any diff exceeds 0.01).
|
|
925
|
+
- `stdlib/tgt.fg` — the gpt2 transformer rebuilt on
|
|
926
|
+
tensor autograd (fused QKV, tied head, 12,608 params at
|
|
927
|
+
the small size), plus tensor Adam and grad clipping.
|
|
928
|
+
- `examples/tgt_tinystories.fg` — same data and sizes as
|
|
929
|
+
the scalar run: forward 100 nodes (scalar: 221,844),
|
|
930
|
+
1500 steps in 6.5 s (4.35 ms/step), held-out loss
|
|
931
|
+
6.30804 -> 5.64615, perplexity 548.97 -> 283.20.
|
|
932
|
+
Sampled generation is still word salad; greedy still
|
|
933
|
+
collapses (now on <unk>). Fluency is NOT claimed.
|
|
934
|
+
|
|
935
|
+
Added (KV-cache for gpt2):
|
|
936
|
+
- `stdlib/inference_gpt2.fg` — plain-float KV-cache step
|
|
937
|
+
for any gpt2 layout (blocks, heads, separate Q/K/V).
|
|
938
|
+
`examples/inference_gpt2_demo.fg` verifies it against
|
|
939
|
+
full-sequence forward: max logit diff 4.44e-16
|
|
940
|
+
(float rounding only). Generation past the trained
|
|
941
|
+
sequence length clamps positions to seq-1 — a
|
|
942
|
+
documented approximation, not a silent model change.
|
|
943
|
+
|
|
944
|
+
Added (scaled training):
|
|
945
|
+
- `tools/prepare_tinystories.py` gains `--out-dir`
|
|
946
|
+
(default `data`); `data_scaled/` holds 500 stories,
|
|
947
|
+
75,000 words, 1000-word vocab, UNK 8.5%.
|
|
948
|
+
- `examples/tgt_tinystories_scaled.fg` — 2 blocks,
|
|
949
|
+
4 heads, d=32, hidden=64, seq=16 words, 49,664 params,
|
|
950
|
+
1500 strided windows (stride 8) x 3 epochs: train
|
|
951
|
+
5.45016, 4.94801, 4.86257; held-out (offset 60000)
|
|
952
|
+
loss 7.02007 -> 5.24241, perplexity 1118.87 -> 189.13;
|
|
953
|
+
117.6 s total, 26.1 ms/step, forward 136 nodes.
|
|
954
|
+
Sampled output is still salad order, with more
|
|
955
|
+
plausible fragments than at the small size.
|
|
956
|
+
|
|
957
|
+
Added (ecosystem, all verified by running):
|
|
958
|
+
- `docs/BENCHMARKS.md` — dot(5000): Qasida 8 µs,
|
|
959
|
+
NumPy 29 µs, Python loops 788 µs; matmul 64x64:
|
|
960
|
+
Qasida 615 µs, NumPy 343 µs (BLAS wins, stated
|
|
961
|
+
plainly), Python 476,501 µs.
|
|
962
|
+
- `web/landing/index.html` — static landing page with
|
|
963
|
+
the verified numbers and honest limits.
|
|
964
|
+
- `setup.py` + `pyproject.toml` + `bin/qasida-pip` —
|
|
965
|
+
`pip install .` verified in a clean venv
|
|
966
|
+
(`qasida-pip --version`, demo runs from another cwd).
|
|
967
|
+
PyPI publication still needs the maintainer's account.
|
|
968
|
+
- `docs/DEBUGGING.md` — gdb-on-emitted-C recipe,
|
|
969
|
+
allocation counters, and the missing piece (see below).
|
|
970
|
+
- `examples/cuda/mlp_train.cu` — GPU SGD trainer for
|
|
971
|
+
XOR using only the verified square-matmul wrapper.
|
|
972
|
+
CODE ONLY, never compiled or run (no nvcc/GPU here);
|
|
973
|
+
needs a Kaggle session with Jayant's token.
|
|
974
|
+
- `examples/cuda/kernel.cu` comment corrected: the
|
|
975
|
+
transformer kernels WERE verified on Kaggle T4 in
|
|
976
|
+
0.3.0 (the old "not yet run" comment was stale).
|
|
977
|
+
|
|
978
|
+
Still NOT done (stated, not implied):
|
|
979
|
+
- Fluent generation; GPU training run (code exists,
|
|
980
|
+
run needs a Kaggle token); WASM strings/arrays (the
|
|
981
|
+
backend is 259 lines with no linear memory at all —
|
|
982
|
+
needs memory + a bump allocator + string/array ops,
|
|
983
|
+
a backend rewrite, not a patch); big32 floats/structs
|
|
984
|
+
(the core is integer-only, no FPU — a core extension);
|
|
985
|
+
a source-level debugger (AST nodes carry line but not
|
|
986
|
+
file, so `#line` mapping would misattribute stdlib
|
|
987
|
+
code — needs file tracking through the parser);
|
|
988
|
+
self-hosting compiler; public registry host, CI upload
|
|
989
|
+
and repo rename (maintainer's clicks/accounts);
|
|
990
|
+
PyPI publication; Mojo/PyTorch benchmark numbers
|
|
991
|
+
(neither installed here).
|
|
992
|
+
|
|
993
|
+
## 0.4.0 — 26 Oct 2026 — TinyStories word GPT
|
|
994
|
+
|
|
995
|
+
Added:
|
|
996
|
+
- `tools/prepare_tinystories.py` — downloads the first 200
|
|
997
|
+
stories of roneneldan/TinyStories (train split) via the HF
|
|
998
|
+
datasets-server rows API, cleans them (lowercase, apostrophes
|
|
999
|
+
removed, other non-letters become spaces), and writes
|
|
1000
|
+
`data/tinystories_vocab.txt` (500 words + <unk>), `data/`
|
|
1001
|
+
`tinystories_ids.txt` (24,000 word ids) and a provenance
|
|
1002
|
+
README. UNK rate in the kept words: 14.8% (28.5% at 200
|
|
1003
|
+
words — the reason vocab went to 500).
|
|
1004
|
+
- `examples/gpt_tinystories.fg` — word-level GPT on that data,
|
|
1005
|
+
reusing stdlib/gpt2.fg: 2 blocks, 2 heads, d=16, hidden=32,
|
|
1006
|
+
seq=8 words, 500-word vocab, 12,608 params. Adam lr 0.02,
|
|
1007
|
+
clip 1.0, 500 strided windows (stride 4, first ~2000 words)
|
|
1008
|
+
x 3 epochs. Held-out test (20 windows from word offset
|
|
1009
|
+
20000, later stories never trained on): loss 6.98368 ->
|
|
1010
|
+
5.51097, perplexity 1078.88 -> 247.39 (a real 4.4x
|
|
1011
|
+
generalisation gain, not a training-set fit). Epoch
|
|
1012
|
+
training losses: 4.98375, 4.64674 (the third epoch's
|
|
1013
|
+
average was lost when its process was OOM-killed during
|
|
1014
|
+
the eval phase — see below — but its checkpoint is the
|
|
1015
|
+
one evaluated here).
|
|
1016
|
+
- `examples/gpt_tinystories_eval.fg` — eval-only companion:
|
|
1017
|
+
loads the checkpoint and reports test loss + generation
|
|
1018
|
+
in its own process.
|
|
1019
|
+
- `examples/tinystories_load_demo.fg` — suite check that the
|
|
1020
|
+
data files load and parse (words = 24000, vocab = 500).
|
|
1021
|
+
|
|
1022
|
+
Generation (from "once upon a time there was a little",
|
|
1023
|
+
30 words): greedy still loops ("cake cake cake ...");
|
|
1024
|
+
sampled (temp 0.8, seed 123) gives real TinyStories words
|
|
1025
|
+
in salad order ("some needed smiled kept lot herself toys
|
|
1026
|
+
lot careful feel idea ..."). Honest verdict: upgraded from
|
|
1027
|
+
letter salad to word salad — the perplexity gain is the
|
|
1028
|
+
solid result; fluent sentences are NOT claimed.
|
|
1029
|
+
|
|
1030
|
+
Found by running (the important limitation of this batch):
|
|
1031
|
+
- The native backend retains each training tape's arrays,
|
|
1032
|
+
so one process running 1500 steps x ~221k nodes grows
|
|
1033
|
+
until the VM's OOM killer ends it (killed during epoch
|
|
1034
|
+
1 of the original single-process run, and again during
|
|
1035
|
+
the eval phase of the 3-epoch run). Training is therefore
|
|
1036
|
+
split into one-epoch processes with checkpoint resume
|
|
1037
|
+
(`qasida run examples/gpt_tinystories.fg`,
|
|
1038
|
+
`... resume`, `... resume final`), and eval runs as its
|
|
1039
|
+
own process. Tape-memory freeing is the open compiler
|
|
1040
|
+
fix for 0.5.0, alongside tensor-level autograd.
|
|
1041
|
+
|
|
1042
|
+
Not yet done: fluent generation (needs far more data,
|
|
1043
|
+
params and steps — OpenMythos 44M on the same dataset took
|
|
1044
|
+
4,850 steps to reach fluent samples), GPU training loop,
|
|
1045
|
+
tensor-level autograd, KV-cache for the gpt2 layout, public
|
|
1046
|
+
registry host, CI upload, repo rename.
|
|
1047
|
+
|
|
1048
|
+
## 0.3.0 — 26 Oct 2026 — Scaled GPT + GPU-verified kernels
|
|
1049
|
+
|
|
1050
|
+
Added:
|
|
1051
|
+
- `stdlib/gpt2.fg` — generalised transformer: any blocks, any
|
|
1052
|
+
head count, any vocab/seq/hidden sizes, with a computed param
|
|
1053
|
+
layout (no hard-coded offsets from gpt.fg)
|
|
1054
|
+
- `examples/gpt_scaled.fg` — 2 blocks, 2 heads, d=16, hidden=32,
|
|
1055
|
+
seq=16, 29-char vocab, 5200 params, on a 411-char story:
|
|
1056
|
+
training loss 2.559 -> 2.364 over 3 epochs (200 windows each),
|
|
1057
|
+
held-out perplexity 58.1 -> 53.9 (test windows 320..327).
|
|
1058
|
+
Generation still loops (greedy) / rambles (sampled) — scale
|
|
1059
|
+
is in architecture and evaluation now, not in fluent text.
|
|
1060
|
+
Checkpoint save/load verified (diff ~8e-07, 6-decimal text).
|
|
1061
|
+
- GPU kernels VERIFIED on real hardware: Kaggle notebook v4,
|
|
1062
|
+
2x Tesla T4, driver 580.178.04, nvcc 12.8.93 — dot 70, matmul
|
|
1063
|
+
19 22 43 50, embedding 1 0 0 1 1 0, layernorm ±0.999980,
|
|
1064
|
+
attention 1.0/0.0, 0.330238/0.669762, 0.802224/0.197776,
|
|
1065
|
+
half matmul 19 22 43 50 — matching simulation to 6 decimals.
|
|
1066
|
+
|
|
1067
|
+
Fixed in this batch (both found by running, not by reading):
|
|
1068
|
+
- Training diverged to NaN at the larger scale: a softmax
|
|
1069
|
+
probability can underflow to exactly 0, and log(0) poisons
|
|
1070
|
+
the tape. g2_loss now adds 1e-9 before the log.
|
|
1071
|
+
- The fp16 kernel did not compile on the first GPU run:
|
|
1072
|
+
`__half2double` does not exist in CUDA; fixed to
|
|
1073
|
+
`(double)__half2float(...)`. Notebook v3 failed to build;
|
|
1074
|
+
v4 is the verified run.
|
|
1075
|
+
|
|
1076
|
+
Not yet done: fluent generation (needs far more data and
|
|
1077
|
+
params than 5200 on 411 chars), GPU training loop (kernels
|
|
1078
|
+
only so far), multi-layer library packaging, public registry
|
|
1079
|
+
host, CI upload, repo rename.
|
|
1080
|
+
|
|
1081
|
+
## 0.2.0 — 26 Oct 2026 — Mojo-level ML stack (tensors, autograd, tiny GPT)
|
|
1082
|
+
|
|
1083
|
+
The language gains the pieces that make people use a language for
|
|
1084
|
+
LLM work, at small-model scale. Everything below is verified by
|
|
1085
|
+
the test suite or by a recorded run; the limits are listed, not
|
|
1086
|
+
hidden.
|
|
1087
|
+
|
|
1088
|
+
Added:
|
|
1089
|
+
- `stdlib/tensor.fg` — Tensor (flat row-major + shape), matmul,
|
|
1090
|
+
transpose, reshape, softmax, GELU, argmax (demo: 19 22 43 50)
|
|
1091
|
+
- `stdlib/autograd.fg` — real reverse-mode scalar tape; gradient
|
|
1092
|
+
matches a numeric gradient exactly at printed precision
|
|
1093
|
+
(df/dx 10.0452 vs numeric 10.0452), plus a sqrt node so
|
|
1094
|
+
LayerNorm backward is exact
|
|
1095
|
+
- `stdlib/nn.fg` — Linear, LayerNorm, single-head causal
|
|
1096
|
+
attention, MLP, Adam/AdamW, cosine/step/warmup schedules,
|
|
1097
|
+
gradient clipping, checkpoints (float text, 6 decimals),
|
|
1098
|
+
int8 quantization, greedy/temperature/top-k/top-p sampling,
|
|
1099
|
+
and a new `parse_float` builtin (needed for checkpoint loads)
|
|
1100
|
+
- `stdlib/tokenizer.fg` — character tokenizer + real BPE
|
|
1101
|
+
(23 chars -> 13 tokens on the demo text, round-trips)
|
|
1102
|
+
- `stdlib/dataset.fg` — sliding-window next-token sequences,
|
|
1103
|
+
train/test split, batching, shuffling
|
|
1104
|
+
- `stdlib/gpt.fg` + `examples/tiny_gpt.fg` — a 1-block, 1-head
|
|
1105
|
+
transformer (d=8, hidden=16, tied head, 776 params) trained by
|
|
1106
|
+
autograd + Adam on "hello world hello qasida": loss
|
|
1107
|
+
2.274 -> 0.360 over 20 epochs (min 0.199 at epoch 16), in ~5 s.
|
|
1108
|
+
Generation is the honest weak point: greedy loops on spaces,
|
|
1109
|
+
temperature sampling gives varied gibberish — a 776-param model
|
|
1110
|
+
on one sentence is a training proof, not a language model.
|
|
1111
|
+
- `stdlib/inference.fg` — KV-cache inference step: step-by-step
|
|
1112
|
+
output matches a full-sequence forward exactly (diff 0);
|
|
1113
|
+
quantized step differs by at most 0.026 on the demo step
|
|
1114
|
+
- `tools/import_torch_weights.py` — imports weights from a text
|
|
1115
|
+
file or (with torch installed elsewhere) a .pt state dict into
|
|
1116
|
+
Qasida functions; text path verified end to end
|
|
1117
|
+
- CUDA: fused attention, LayerNorm, embedding and fp16 matmul
|
|
1118
|
+
kernels added to `examples/cuda/kernel.cu`, verified by
|
|
1119
|
+
`tools/simulate_cuda.py` (attention 1.0/0.0, 0.330/0.670, ...)
|
|
1120
|
+
|
|
1121
|
+
Not yet done, and not claimed:
|
|
1122
|
+
- The new CUDA kernels have NOT run on a real GPU yet (no nvcc
|
|
1123
|
+
here; a Kaggle T4 run is the remaining step, as before)
|
|
1124
|
+
- No torch in this VM, so the .pt branch of the importer is
|
|
1125
|
+
provided but not run here; the text branch is verified
|
|
1126
|
+
- No 1B model, no distributed training, no MLIR compiler — the
|
|
1127
|
+
beachhead is small models that train and run natively
|
|
1128
|
+
|
|
1129
|
+
## 0.1.0 — 26 Oct 2026 — First Qasida market release
|
|
1130
|
+
|
|
1131
|
+
Formerly Forge v2. The language itself is unchanged in this
|
|
1132
|
+
release; this release is about making it installable and usable
|
|
1133
|
+
by a stranger.
|
|
1134
|
+
|
|
1135
|
+
Added:
|
|
1136
|
+
- `qasida` command (`bin/qasida`) — `qasida run`, `qasida --version`
|
|
1137
|
+
- `qasida --version` / `qasida version` — prints "Qasida 0.1.0"
|
|
1138
|
+
- `scripts/install.sh` — one-command user install, checks python3
|
|
1139
|
+
and cc, symlinks into `~/.local/bin`, verifies with the demo
|
|
1140
|
+
- This changelog
|
|
1141
|
+
|
|
1142
|
+
Included from Forge v2 (all verified by tests, see README.md):
|
|
1143
|
+
- Types int/float/bool/str/[T], structs, enums + match, generics,
|
|
1144
|
+
Option/Result, `?` operator, threads, C FFI, HTTP/HTTPS, file I/O
|
|
1145
|
+
- Safe mode (checked arithmetic, bounds-checked) and fast mode
|
|
1146
|
+
- ML: dot/matmul, linear regression training, MLP XOR training
|
|
1147
|
+
by backprop (loss 0.558973 -> 0.000267766)
|
|
1148
|
+
- Backends: native C, big32 RISC-V (simulation), WASM (int/float/bool),
|
|
1149
|
+
CUDA kernels (verified on Kaggle Tesla T4, dot 70, matmul 19 22 43 50)
|
|
1150
|
+
- Tooling: `qasida pkg`, `qasida fmt`, `qasida lsp`, `qasida repl`, `qasida doc`
|
|
1151
|
+
- Examples: hello, matrix, todo CLI, Teju special, dates/rand,
|
|
1152
|
+
SQL/table/KV demos, high-school guide, web playground, book starter
|
|
1153
|
+
- Dedicated to Tejaswini — Qasida (see DEDICATION.md)
|
|
1154
|
+
|
|
1155
|
+
Known limits in 0.1.0 (honest, not hidden):
|
|
1156
|
+
- No public package registry host yet (server + Dockerfile exist)
|
|
1157
|
+
- WASM: no strings/arrays yet; big32: no floats/structs yet
|
|
1158
|
+
- No debugger, no fuzzing, no self-hosting compiler yet
|
|
1159
|
+
- CI workflow is local only until uploaded via GitHub web UI
|
|
1160
|
+
(token lacks workflow scope)
|
|
1161
|
+
- Repo is still called RED-MOON- on GitHub; renaming it is a
|
|
1162
|
+
web-UI step, and the tool file is still `forge.py` for
|
|
1163
|
+
compatibility — `qasida` is the new market name for it.
|