Files
bara-lang/docs/bg/05-user-guide.md
T
dimgigov 7adace4ee1 docs: update documentation for May 12 compiler fixes
- 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
2026-05-12 14:10:31 +03:00

5.2 KiB
Raw Blame History

← Към индекса


Ръководство за Потребителя — Bara Lang

Инсталация

Изисквания

  • Nim >= 2.0
  • GCC или Clang
  • make

Изграждане от Източник

git clone https://gitlab.com/balvatar/lisp-nim.git
cd lisp-nim
make build

CLI Команди

compile — Компилиране до Nim

./cljnim compile input.clj output.nim

Генерира .nim файл от Clojure изходен код.

run — Компилиране и Изпълнение

./cljnim run examples/hello.clj

Компилира до Nim, после до C, после до бинарен файл, и го изпълнява.

Глобални Флагове

--lib-path <dir> — Потребителска Директория за Библиотеки

Презаписва стандартния път за търсене на lib/. Проверява се преди CLJNIM_LIB_PATH environment променлива и вградените пътища.

./cljnim --lib-path ./my_project/lib run app.clj

Алтернатива чрез environment променлива:

export CLJNIM_LIB_PATH=./my_project/lib
./cljnim run app.clj

read — Парсиране и Отпечатване на AST

./cljnim read examples/hello.clj

Показва Clojure AST като S-изрази.

repl — Интерактивен REPL

# Човешки режим
./cljnim repl

# AI режим (структуриран JSON)
./cljnim repl --json

Писане на Bara Lang Програми

Базов Синтаксис

; Коментарите започват с точка и запетая

; Дефиниране на променлива
(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

Работа с Данни

; Вектори (използват 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) операции.

Рекурсия

(defn factorial [n]
  (if (= n 0)
    1
    (* n (factorial (- n 1)))))

(println (factorial 5))  ; => 120

Функции от Първи Клас

Потребителските функции могат да се подават като стойности на функции от по-висок ред:

(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

(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

./cljnim repl --json

Оценка на Форма

{"op": "eval", "form": "(+ 1 2 3)"}

Отговор:

{
  "status": "ok",
  "result": {"printed": "6"},
  "meta": {"ns": "user", "ms": 861, "form": "(+ 1 2 3)"}
}

Batch Оценка

{"op": "eval-batch", "forms": ["(defn f [x] x)", "(f 42)"]}

Листване на Дефиниции

{"op": "get-defs"}

Отговор:

{"status": "ok", "defs": ["f"], "ns": "user"}

Изчистване на Сесия

{"op": "clear"}

Изход

{"op": "quit"}

Съвети

  • Използвайте :help в човешки REPL за налични команди.
  • Дефинициите в REPL се запазват през оценките в рамките на една сесия.
  • Флагът --json прави REPL изцяло машинно-четим.