7adace4ee1
- CLJNIM_RECOMMENDATIONS.md: mark all 12 recommendations as implemented - README.md: add --lib-path, first-class functions, multi-arity, rest params - User guides (EN/BG): add sections for docstrings, multi-arity, rest params, keyword-as-function, first-class functions, loop/recur, --lib-path flag - TASKS.md: add Phase 11 with all BRing compiler fixes
218 lines
5.2 KiB
Markdown
218 lines
5.2 KiB
Markdown
|
||
[← Към индекса](index.md)
|
||
|
||
---
|
||
|
||
# Ръководство за Потребителя — Bara Lang
|
||
|
||
## Инсталация
|
||
|
||
### Изисквания
|
||
- Nim >= 2.0
|
||
- GCC или Clang
|
||
- make
|
||
|
||
### Изграждане от Източник
|
||
```bash
|
||
git clone https://gitlab.com/balvatar/lisp-nim.git
|
||
cd lisp-nim
|
||
make build
|
||
```
|
||
|
||
## CLI Команди
|
||
|
||
### `compile` — Компилиране до Nim
|
||
```bash
|
||
./cljnim compile input.clj output.nim
|
||
```
|
||
Генерира `.nim` файл от Clojure изходен код.
|
||
|
||
### `run` — Компилиране и Изпълнение
|
||
```bash
|
||
./cljnim run examples/hello.clj
|
||
```
|
||
Компилира до Nim, после до C, после до бинарен файл, и го изпълнява.
|
||
|
||
### Глобални Флагове
|
||
|
||
#### `--lib-path <dir>` — Потребителска Директория за Библиотеки
|
||
Презаписва стандартния път за търсене на `lib/`. Проверява се преди `CLJNIM_LIB_PATH` environment променлива и вградените пътища.
|
||
|
||
```bash
|
||
./cljnim --lib-path ./my_project/lib run app.clj
|
||
```
|
||
|
||
Алтернатива чрез environment променлива:
|
||
```bash
|
||
export CLJNIM_LIB_PATH=./my_project/lib
|
||
./cljnim run app.clj
|
||
```
|
||
|
||
### `read` — Парсиране и Отпечатване на AST
|
||
```bash
|
||
./cljnim read examples/hello.clj
|
||
```
|
||
Показва Clojure AST като S-изрази.
|
||
|
||
### `repl` — Интерактивен REPL
|
||
```bash
|
||
# Човешки режим
|
||
./cljnim repl
|
||
|
||
# AI режим (структуриран JSON)
|
||
./cljnim repl --json
|
||
```
|
||
|
||
## Писане на Bara Lang Програми
|
||
|
||
### Базов Синтаксис
|
||
```clojure
|
||
; Коментарите започват с точка и запетая
|
||
|
||
; Дефиниране на променлива
|
||
(def x 42)
|
||
|
||
; Дефиниране на функция
|
||
(defn greet [name]
|
||
(println "Здравей, " name))
|
||
|
||
; Функция с docstring
|
||
(defn greet "Поздравява някого" [name]
|
||
(str "Здравей, " name))
|
||
|
||
; Multi-arity функция
|
||
(defn greet-multi
|
||
([name] (greet-multi name "Здравей"))
|
||
([name greeting] (str greeting ", " name)))
|
||
|
||
; Функция с rest параметри
|
||
(defn sum-all [x & rest]
|
||
(+ x (reduce + rest)))
|
||
|
||
; Извикване на функция
|
||
(greet "Свят")
|
||
(greet-multi "Алиса") ;; => "Здравей, Алиса"
|
||
(greet-multi "Алиса" "Здрасти") ;; => "Здрасти, Алиса"
|
||
(sum-all 1 2 3 4) ;; => 10
|
||
|
||
; Аритметика
|
||
(+ 1 2 3) ; => 6
|
||
(* 10 20) ; => 200
|
||
(/ 100 4) ; => 25
|
||
|
||
; Условни изрази
|
||
(if (> x 0)
|
||
"положително"
|
||
"неположително")
|
||
|
||
; Локални обвързвания
|
||
(let [a 10
|
||
b 20]
|
||
(+ a b)) ; => 30
|
||
```
|
||
|
||
### Работа с Данни
|
||
```clojure
|
||
; Вектори (използват Nim seq вътрешно)
|
||
(def nums [1 2 3 4 5])
|
||
|
||
; Ключови думи
|
||
(def person {:name "Алиса" :age 30})
|
||
|
||
; Ключова дума като функция (търсене в карта)
|
||
(:name person) ;; => "Алиса"
|
||
(:age person) ;; => 30
|
||
|
||
; Картите и множествата използват persistent HAMT структури
|
||
; със structural sharing и O(log₃₂ n) операции.
|
||
```
|
||
|
||
### Рекурсия
|
||
```clojure
|
||
(defn factorial [n]
|
||
(if (= n 0)
|
||
1
|
||
(* n (factorial (- n 1)))))
|
||
|
||
(println (factorial 5)) ; => 120
|
||
```
|
||
|
||
### Функции от Първи Клас
|
||
Потребителските функции могат да се подават като стойности на функции от по-висок ред:
|
||
|
||
```clojure
|
||
(defn square [x] (* x x))
|
||
(defn odd? [x] (= 1 (mod x 2)))
|
||
|
||
(map square [1 2 3 4]) ;; => [1 4 9 16]
|
||
(filter odd? [1 2 3 4]) ;; => [1 3]
|
||
(apply + [1 2 3]) ;; => 6
|
||
```
|
||
|
||
### Loop / Recur
|
||
```clojure
|
||
(defn find-header [headers name]
|
||
(loop [pairs (seq headers)]
|
||
(if (empty? pairs)
|
||
nil
|
||
(let [[k v] (first pairs)]
|
||
(if (= k name)
|
||
v
|
||
(recur (rest pairs)))))))
|
||
|
||
(find-header [[:content-type "text/html"] [:accept "*/*"]] :accept)
|
||
;; => "*/*"
|
||
```
|
||
|
||
## Ръководство за AI REPL
|
||
|
||
JSON REPL е проектиран за програмно взаимодействие.
|
||
|
||
### Стартиране на AI REPL
|
||
```bash
|
||
./cljnim repl --json
|
||
```
|
||
|
||
### Оценка на Форма
|
||
```json
|
||
{"op": "eval", "form": "(+ 1 2 3)"}
|
||
```
|
||
Отговор:
|
||
```json
|
||
{
|
||
"status": "ok",
|
||
"result": {"printed": "6"},
|
||
"meta": {"ns": "user", "ms": 861, "form": "(+ 1 2 3)"}
|
||
}
|
||
```
|
||
|
||
### Batch Оценка
|
||
```json
|
||
{"op": "eval-batch", "forms": ["(defn f [x] x)", "(f 42)"]}
|
||
```
|
||
|
||
### Листване на Дефиниции
|
||
```json
|
||
{"op": "get-defs"}
|
||
```
|
||
Отговор:
|
||
```json
|
||
{"status": "ok", "defs": ["f"], "ns": "user"}
|
||
```
|
||
|
||
### Изчистване на Сесия
|
||
```json
|
||
{"op": "clear"}
|
||
```
|
||
|
||
### Изход
|
||
```json
|
||
{"op": "quit"}
|
||
```
|
||
|
||
## Съвети
|
||
|
||
- Използвайте `:help` в човешки REPL за налични команди.
|
||
- Дефинициите в REPL се запазват през оценките в рамките на една сесия.
|
||
- Флагът `--json` прави REPL изцяло машинно-четим.
|