Size: a a a

2020 August 15

SD

Sergey D in Lisp Forever
Про комментарии. Говорят, в clojure код комментируют через (comment (something)). Тогда код остаётся кодом (т.е. можно легко его заевалить в репл), а не комментарием, но не исполняется. В common lisp предлагается #+(or).
источник

a

akater in Lisp Forever
В CL тоже некоторые предлагают использовать comment

В Clojure нет ридер-макросов; м.б., что и с синтаксисом для комментов так потому.  В CL ; это ридер-макрос.
источник

PG

Pig Greenest in Lisp Forever
Ещё есть #|...|#
источник

V(

Vλadimir (Hawthorne ... in Lisp Forever
Там Бородуст рапортует в твиттере, что его С++-автоген биндинги заработали
источник

m

mel kaye in Lisp Forever
Hirrolot
А почему просто не сделать

(defmacro when (condition &rest body)
 (if condition (progn body)))

?
на этом макросе не очень понятно зачем квоты нужны, но вот с анафорическим ифом это яснее
(defmacro aif (cond . body)
 `(let ((it ,cond)) ,@body))

(aif (list 1 2 3)
 (print it))

https://en.m.wikipedia.org/wiki/Anaphoric_macro
источник

m

mel kaye in Lisp Forever
или например вышеупомянутый let. он тоже макрос
источник

PG

Pig Greenest in Lisp Forever
cons*/list* убирает необходимость ,@ в 90% случаев
источник

m

mel kaye in Lisp Forever
(let ((a 1) (b 2)) (+ a b))
=>
((lambda (a b) (+ a b)) 1 2)
источник

m

mel kaye in Lisp Forever
просто и гениально
источник

AP

Alex Peresmeshnik in Lisp Forever
mel kaye
просто и гениально
Не то, что в кложе
источник

m

mel kaye in Lisp Forever
то же самое технически можно было бы сделать функцией в теле которой бы первым делом менялась локальная таблица переменных добавлением биндинга it
источник

m

mel kaye in Lisp Forever
Alex Peresmeshnik
Не то, что в кложе
твое экспертное мнение очень для нас важно
источник

m

mel kaye in Lisp Forever
mel kaye
то же самое технически можно было бы сделать функцией в теле которой бы первым делом менялась локальная таблица переменных добавлением биндинга it
хотя нет, в любом случае приходилось бы передавать списки и эвалить
источник

a

akater in Lisp Forever
Hirrolot
А почему просто не сделать

(defmacro when (condition &rest body)
 (if condition (progn body)))

?
Короткий ответ: тело defmacro — оно примерно такое же как тело defun, но (1) аргументы не вычисляются; (2) тело должно по вычислении вернуть код.  Тут при вычислении было бы вот что:

(when x y z)

попыталось бы вычислить

(if 'x (progn '(y z)))

и получить в результате код.  Ясно, что уже (y z) это бессмысленно.  Но и if-то раскрылся бы в macroexpansion time (слишком рано), тогда как when должно макрораскрыться в код вида (if ..).

Ксттаи, тут надо писать &body, а не &rest.
источник

PG

Pig Greenest in Lisp Forever
akater
Короткий ответ: тело defmacro — оно примерно такое же как тело defun, но (1) аргументы не вычисляются; (2) тело должно по вычислении вернуть код.  Тут при вычислении было бы вот что:

(when x y z)

попыталось бы вычислить

(if 'x (progn '(y z)))

и получить в результате код.  Ясно, что уже (y z) это бессмысленно.  Но и if-то раскрылся бы в macroexpansion time (слишком рано), тогда как when должно макрораскрыться в код вида (if ..).

Ксттаи, тут надо писать &body, а не &rest.
Не (y z), а y z
источник

a

akater in Lisp Forever
Pig Greenest
Не (y z), а y z
CL-USER> (defmacro my-when (condition &rest body)
 (if condition (progn body)))


MY-WHEN
CL-USER> (macroexpand '(my-when t y z))
(Y Z)
источник

PG

Pig Greenest in Lisp Forever
источник

a

akater in Lisp Forever
Ну в общем, он вычисляет в итоге не z, а (y z). Наверное, я должен был его процитировать.
источник

PG

Pig Greenest in Lisp Forever
Тьфу, у тебя же сплайса нету
источник

PG

Pig Greenest in Lisp Forever
Туплю
источник