1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zzhicanfly-juner_os

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
grammar.md 8.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 02:55 ec89fe2

Синтаксис Lisp

Тип данных

  • Boolean true/false.
  • Empty type nil.

Связывание значений с символами (S-выражениями)

def!

def! x1 S)

x1 — это символ, который нужно связать. S — S-выражение, которое нужно связать. Пример:

(def! mynum 111)
=> 111
;; Это связывает значение с символом mynum.

let*

(let* (p (+ 2 3)
       q (+ 2 p)) (+ p q))
=> 12

Временное присваивание с использованием let*.

lambda

((lambda [x] (+ 1 x)) 1)
=> 2

Определение процедуры замыкания. Её можно комбинировать с def! для определения функции. Обратите внимание на синтаксис аргументов. Если вы используете символ & перед аргументом, вы можете указать, что несколько аргументов находятся в списке. Его можно использовать только перед последним аргументом.

do

(do (+ 1 2) (+ 3 4) 5)
=> 5

Вычисляет значение каждого элемента в списке и затем возвращает значение последнего элемента.

list

(list 1 2 3)
=> (1 2 3)

Создаёт список Lisp.

read-string

(read-string "Nil")
=> Nil

(read-string "(+ 1 1)")
=> (Fn*<xxx00> 1 1)

Читает строку для создания объекта Lisp, обратите внимание, что создаётся только объект, но не выполняется оценка.

eval

(eval (read-string "(1+ 1 3)"))
=> 4

(eval (list + 1 3))
=> 4

Оценивает объект Lisp. В этом методе нет границы между данными и кодом в Lisp. Слой данных и кода протыкается.

prn Печатает символ и сообщает об ошибке, если он не существует.

(prn abc)
=> not found 'abc'

quote Указывает, что следующее значение является самим символом. Может использоваться вместе с prn.

(prn (quote abc))

=> abc
=> Nil

Объяснение: печать abc является побочным эффектом функции prn. Реальный возврат функции prn — Nil.

' ' — грамматический сахар quote. 'abc и (quote abc) полностью эквивалентны. На самом деле он также переводится в форму цитаты внутри интерпретатора.

quasiquote, unquote и splice-unquote quasiquote создаёт нотацию, которую можно временно оценить. Если используется отдельно, нет разницы между unquote и quote. Используется вместе с unquote и splice-unquote. Существует небольшая разница. unquote означает, что следующий символ временно оценивается. splice-unquote берёт временное значение, а затем расширяет список. Конкретные примеры следующие.

(def! lst '(2 3))
=> (2 3)

(quasiquote (1 (unquote lst)))
=> (1 (2 3))

(quasiquote (1 (splice-unquote lst)))
=> (1 2 3)

` 、 ~ и ~@ Грамматический сахар quasiquote, unquote и splice-unquote;

(def! lst '(2 3))
=> (2 3)

`(1 lst)
=> (1 (2 3))

`(1 ~@lst)
=> (1 2 3)

cons Эта функция соединяет свой первый аргумент со вторым аргументом (списком) и возвращает новый список.

(cons [1] [2 3])
=> ([1] 2 3)

(cons 1 [2 3])
=> (1 2 3)

concat Эта функция принимает ноль или более списков в качестве аргументов и возвращает новый список, состоящий из всех аргументов этих списков.

(concat [1 2] (list 3 4) [5 6])
=> (1 2 3 4 5 6)

(concat [1 2])
=> (1 2)

defmacro! и macroexpand Макроопределение и макрорасширение. Макроопределение определяет символ. Его возвращаемое значение будет продолжать оцениваться как AST. Всё это можно широко использовать с предыдущими синтаксическими сахарами, такими как ' ` ~ ~ @ d и т. д. Макрорасширение. Расширяет макрос, чтобы вычислить только последнее из требуемых значений без его оценки.

(defmacro! unless (lambda (pred a b) `(if ~pred ~b ~a)))

=> ...(Опущено здесь)

(unless false 7 8)
=> 7

(macroexpand (unless false 7 8))
=> (if fasle 7 8)

nth Эта функция берёт список (или вектор) и число (порядковый номер) в качестве аргументов и возвращает элемент списка в заданной порядковой позиции. Если порядковый номер превышен, функция генерирует исключение.

(nth [1 2 3] 0)
=> 1

(nth '(1 2 3) 1)
=> 2

first Эта функция принимает список (или вектор) в качестве аргумента и возвращает его первый элемент, или nil, если список (или вектор) пуст, или если сам аргумент равен nil.

(first '((1 2) 2 3))

=> (1 2)

count Таблица. Как и ранее, обратите внимание, что исходная хеш-таблица не изменяется, за исключением того, что новая хеш-таблица возвращается с удалённым ключом, указанным в аргументе. Ключи в списке параметров, которых не было в исходной хеш-таблице, игнорируются.

  • get: принимает хеш-таблицу и ключ, возвращает значение, соответствующее ключу в хеш-таблице или nil, если ключ не существует в хеш-таблице.
  • contains?: принимает хеш-таблицу и ключ, возвращает true, если хеш-таблица содержит ключ, в противном случае возвращает false.
  • keys: принимает хеш-таблицу и возвращает список (значение списка в mal), содержащий все ключи в хеш-таблице.
  • vals: принимает хеш-таблицу и возвращает список (значений в mal), содержащий все значения в хеш-таблице.

Обратите внимание, что ни один из вышеперечисленных методов не имеет побочных эффектов, то есть они не изменяют значения принципа. Если вы собираетесь это сделать, рекомендуется использовать atom или redef!

gensym генерирует новый символ для системы.

(gensym)
=> Каждый раз получается разный результат!

cond multiconditional. Есть чётное количество аргументов: один для условия и один для возвращаемого значения.

(def! ten-test (lambda [data]
                (cond
                    (> data 10) 1
                    (= data 10) 0
                    (< data 10) -1)))

(ten-test 15)
=> 1

# ls

Список файлов и папок в текущем каталоге.

(ls)
=> (. .. mal)

(ls "mal")
=> (. .. hello.mal)

# read-file

Считывает содержимое файла в строку.

(read-file "mal/hello.mal")
=> "(+ 1 1)"

# load-file

Читает файл в формате mal и загружает содержащиеся в нём инструкции. Возвращает nil. a.mal

(def! test (lambda [x] (prn x)))
(load-file "a.mal")
=> nil
(test "x")
=> "x"
=> nil

TODO другие базовые функции.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/zzhicanfly-juner_os.git
git@api.gitlife.ru:oschina-mirror/zzhicanfly-juner_os.git
oschina-mirror
zzhicanfly-juner_os
zzhicanfly-juner_os
master