Синтаксис Lisp
Тип данных
Связывание значений с символами (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 Таблица. Как и ранее, обратите внимание, что исходная хеш-таблица не изменяется, за исключением того, что новая хеш-таблица возвращается с удалённым ключом, указанным в аргументе. Ключи в списке параметров, которых не было в исходной хеш-таблице, игнорируются.
Обратите внимание, что ни один из вышеперечисленных методов не имеет побочных эффектов, то есть они не изменяют значения принципа. Если вы собираетесь это сделать, рекомендуется использовать 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 )