Остальные аргументы
Можно также написать это как
(defun repeatedly (n f &rest args)
(loop repeat n collect (apply f args)))
Таким образом, нет необходимости создавать список аргументов самостоятельно.
Тогда его называют:
> (repeatedly 5 #'random (1- x))
(7 2 3 1 4)
вместо (repeatedly 5 #'random (list (1- x)))
сокращенная запись через макросы
короткие лямбда-нотации также могут быть достигнуты с помощью макросов для некоторых целей:
> (defun repeatedly (n function)
(loop repeat n collect (funcall function)))
REPEATEDLY
> (repeatedly 5 (lambda () (random 10)))
(1 7 1 7 8)
> (defmacro ⧨ (&body body) `(lambda () ,@body))
⧨
> (repeatedly 5 (⧨ (random 10)))
(9 3 0 7 0)
or alternatively:
> (defmacro ⧩ (&body body) `(lambda () ,body))
⧩
> (repeatedly 5 (⧩ random 10))
(9 7 7 7 5)
стиль
Часто также не нужно и не желательно писать языковые конструкции как макрос чтения . Расширение s-выражений лучше оставить ниже уровня языка программирования -> s-выражения в основном представляют собой синтаксис данных.
В большинстве кодов на Лиспе фактически можно найти lambda
выражений, используемых без каких-либо сокращений. Обычный стиль Lisp - это использование символических имен, а не столько специальных символов или специального синтаксиса лексики / токена. Это делает текст немного длиннее, но имеет и другие преимущества. Например, можно увидеть одно и то же lambda
в тексте и в прочитанном или даже запущенном коде ...