Rust дээр бичиж байгаа context-oriented програмчлалын хэл. Гол санаа нь: объектууд одоогийн нөхцөл байдал буюу situation-с хамаарч өөр өөрөөр ажиллах ёстой - яг л чи ажил дээрээ өөрөөр, гэртээ өөрөөр биеэ авч явдаг шиг.
Story:
Print "Hello, SFX!"
Numbers is [10, 20, 30]
Print Numbers[1] # хариу 10 - тийм ээ индекс 1-ээс эхэлдэг
SFX бол анхны бие даасан Context-Oriented Programming хэл. Өмнөх COP implementation-ууд (ContextJ, ContextPy гэх мэт) бүгд бусад хэлнүүд дээр залгаж тавьсан extension-ууд байсан. SFX-д Situation болон Switch syntax хэлний үндсэн бүтцэд шууд орсон.
Уламжлалт OOP-ийн ёс журмаас залхаад л эхлүүлсэн юм. Яагаад объектууд зүгээр л... context-оос хамаарч өөрчлөгдөж болдоггүй юм бэ? Бодит амьдрал дээр User объект админ үед өөрөөр, зочин үед өөрөөр ажилладаг шүү дээ. Ихэнх хэлнүүдэд strategy pattern, dependency injection, эсвэл runtime type check хэрэгтэй болдог. SFX-д:
Situation: AdminMode
Adjust User:
To GetPermissions:
Return "admin,write,delete"
Concept: User
To GetPermissions:
Return "read"
Story:
Create User Called Bob
Print Bob.GetPermissions # "read"
Switch on AdminMode
Print Bob.GetPermissions # "admin,write,delete"
Switch off AdminMode
Print Bob.GetPermissions # "read"
Ажиллаж байгаа:
- Python маягийн indentation-тай Lexer/parser
- Tree-walking interpreter
- Cranelift ашигласан JIT (100 удаа дуудагдсаны дараа идэвхждэг)
- Reactive
Whenobserver-ууд - Standard library: HTTP, WebSocket, TCP, JSON, CSV, XML, HTML, TOML, LLM, File I/O
Do in backgroundболон channel-тай async- 1-ээс эхэлдэг index, arbitrary precision тоо
Шинээр нэмэгдсэн:
- Trace debugger (
sfex debug) - Жижиг LSP сервер (stdio diagnostics)
- Project scaffolding (
sfex new) + package install (sfex install) - Error message-үүд line/column мэдээлэлтэй болсон
- Dev web сервер (
sfex serve+Web.Serve)
git clone https://github.com/roriau0422/sfex-lang.git
cd sfex-lang
cargo build --release
./target/release/sfex run your_script.sfexRust 1.75+ хэрэгтэй.
Хачин санагдаж магадгүй зарим шийдвэрүүд:
1-ээс эхлэх index: List[1] бол эхний элемент. Ингэж л хүмүүс тоолдог шүү дээ. Lua ч тэгдэг. R ч тэгдэг. MATLAB ч тэгдэг.
Default-аар arbitrary precision: SFX дээр 0.1 + 0.2 = 0.3, 0.30000000000000004 биш. Хурд хэрэгтэй бол FastNumber хэрэглэ.
Null байхгүй: Хувьсагчид аюулгүй утгаар эхэлдэг (0, "", False, []). "Утга байхгүй" гэж хэрэгтэй бол Option-г Some(x) эсвэл None-тэй хэрэглэ.
Grapheme-aware string: "👨👩👧👦".Length бол 1, 7 биш. Нэг тэмдэгт учраас.
# Хувьсагч
Name is "Alice"
Age is 25
Items is [1, 2, 3]
# Concept (class шиг юм)
Concept: Person
Name, Age
To Greet:
Print "Hi, I'm " + This.Name
# Control flow
If Age > 18:
Print "Adult"
Else:
Print "Minor"
Repeat 10 times:
Print "Hello"
For each Item in Items:
Print Item
# Pattern matching
When Score:
is 100:
Print "Perfect"
is 90:
Print "Great"
Otherwise:
Print "OK"
Миний хамгийн дуртай feature. When block тодорхой нөхөлд автоматаар ажилладаг:
Concept: Product
Price, Tax, Total
When Price changes:
Set This.Tax to This.Price * 0.1
Set This.Total to This.Price + This.Tax
Story:
Create Product Called Phone
Set Phone.Price to 100
# Tax одоо 10, Total одоо 110 - автоматаар
Pub/sub boilerplate байхгүй. Гараар invalidate хийх хэрэггүй. Зүгээр л ажилладаг.
| Модуль | Юу хийдэг |
|---|---|
| HTTP | GET/POST/PUT/DELETE |
| WebSocket | Bidirectional real-time |
| TCP/UDP | Low-level socket |
| JSON/XML/HTML/CSV/TOML | Parse хийх, үүсгэх |
| Data | Формат автоматаар таниад parse хийх |
| File | Унших/бичих/stream |
| Env | Environment variable, .env support |
| System | Shell command |
| Time | Огноо/цаг |
| Math | Random, тригонометр, тоймлох |
| LLM | OpenAI API integration |
| Task/Channel | Concurrency primitive |
| Web | Dev HTTP server + router |
Handler файл (жишээ нь app.sfex) үүсгэнэ:
Story:
If Request.Path = "/":
Response is Web.Response("Hello from SFX!", 200)
Otherwise:
Response is Web.Response("Not Found", 404)
Router example:
Story:
Router is Web.Router()
Router.Get("/hello", "handlers/hello.sfex")
Router.Static("/assets", "public")
Router.Serve("127.0.0.1:8000")
Request fields: Method, Path, Query, Params, Headers, Body, Cookies Helpers: Web.Json, Web.File, Web.Redirect, Web.Stream
Ажиллуулах:
sfex serve app.sfex --addr 127.0.0.1:8000 --static-dir public
sfex serve app.sfex --addr 127.0.0.1:8443 --tls-cert cert.pem --tls-key key.pemJIT нь Cranelift хэрэглэдэг. Function 100 удаа дуудагдсаны дараа native код болж compile хийгддэг. AMD Ryzen дээрх миний benchmark:
- Энгийн арифметик loop: ~230M iteration/sec (JIT) vs ~45M (interpreted)
- Fibonacci(30): ~3M call/sec
Эдгээр тоонуудад бүрэн ач холбогдол өгөх шаардлаггүй. Бодит performance чиний бодит кодоос хамаарна.
Situation Framework eXchange. Бас сайхан сонсогддог.
Ганцаараа хийж байгаа project, гэхдээ дараах зүйлсэд туслах хүнд баяртай талархах болно:
- Илүү сайн error message
- Test coverage
- Баримтжуулалт
Issue-г https://github.com/roriau0422/sfex-lang/issues дээр бичээрэй
Apache 2.0
Тэмүүжин - roriau@gmail.com
Хөгжүүлэлт явагдаж байгаа, дуусаагүй. Тиймээс ажиллахгүй зүйлс байгаа байх. Гэхдээ үндсэн санаа ажиллаж байгаа, идэвхтэй хөгжүүлж байна.