LINUX.ORG.RU

[common lisp] defmacro: "," или ",@"

 


0

0

Чем в макросе

(defmacro with-append (left right &body body)
  `(append (list ,left)
	   (if (listp ,@body)
	       ,@body
	       (list ,@body))
	   (list ,right)))


(defun h-html (bodyss)
  (print-html (with-append "<html>" "</html>" bodyss)))

",@body" (h-html компилится без ошибок) отличается от ",body" (h-html компилится с ворнингом, что нет функции bodyss)? То есть, что означает символ «@»?

Гуглить по поводу символа «@» не получилось - гугл съедает его.

★★

@ разворачивает список внутри.

balodja ★★★
()

``Without an at sign, the comma causes the value of the subexpression to be included as is. With an at sign, the value--which must be a list--is «spliced» into the enclosing list." (c) PCL

anonymous
()

redirect to lisper.ru

anonymous
()

Добавление @ «вклеивает» в список. Т.е. CL-USER> `(,(list 1));=> ((1)) CL-USER> `(,@(list 1)) (1)

anonymous
()
Ответ на: комментарий от dmitry_vk

Спасибо всем за помощь.

bk_ ★★
() автор топика

кстати, есть еще ",."
оно аналогично ",@"
но ему позволено деструктивно изменять списки(",@" всегда возвращает новый)

Love5an
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.