LINUX.ORG.RU

«`» - это макровская квота. Всё, что лежит внутри «`», будет в прямом виде вставлено в место раскрытия макроса. Чтобы внутри «`» для конкретного s-exp'а опять переключиться в режим раскрытия, нужно использовать запятую ",". Если использовать форму ",@" на списке, то список будет раскрыт поэлементно (обычно так body раскрывают, как ,@body).

mv ★★★★★
()
Ответ на: комментарий от archimag

И в чём, собственно вопрос? «Я ничего не понимаю» это не вопрос :)

Про макросы в целом не понятно, видать.

mv ★★★★★
()
Ответ на: комментарий от mv

> Про макросы в целом не понятно, видать.

В целом, вроде бы, понятно. Но...

Согласен, «ничего не понимаю», это не вопрос. Тем не менее, ваше объяснение очень понятным оказалось, сеньк, сразу разобрался.

TirNaNOg
() автор топика
Ответ на: комментарий от mv

А что, списки подстановкой значений в шаблон формировать нужно только в макрах-шмакрах? Backquote имеет и более полезные применения в мирных целях.

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

А что, списки подстановкой значений в шаблон формировать нужно только в макрах-шмакрах? Backquote имеет и более полезные применения в мирных целях.

Человек про ` и @ в макросах спрашивал.

mv ★★★★★
()
Ответ на: комментарий от mv

> Человек про ` и @ в макросах спрашивал.

Ну вот это как раз важно понять, что ` и @ не имеют какого-либо специального смысла в макросах, их можно так же использовать и в обычном коде.

archimag ★★★
()

>> Сижу туплю, объясните, плс, работу ` и @.

Во-первых не «@» а ",@". Во-вторых, как уже написал archimag, к макросам это не имеет никакого специального отношения. Что делает обычная кавычка (') понятно? Типа '(1 2 3)? Так вот, обратная кавычка (`) делает то же самое, за исключением того, что часть «закавыченного» sexp можно «раскавычить» при помощи запятой - `(x ,y z), т.е. вместо символа y в списке будет значение переменной, которую именует символ - (x 3 z). ,@ - аналогично запятой раскавычивает часть выражения, но еще и интерполирует его внутрь выражения если это список. Т.е. если y=(4 5), то

'(x y z) = (x y z)
`(x y z) = (x y z)
`(x ,y z) = (x (4 5) z)
`(x ,@y z) = (x 4 5 z)

Ферштейн?

cathode
()

Вам всё уже объяснили, и тут есть одна подстава. Константные части шаблона могут быть общими между разными его «воплощениями». Побочные эффекты могут наделать бед.
Например:

(defun fff (x) `(,x 2 3))
(fff 1) вернёт (1 2 3)
(fff 4) вернёт (4 2 3)

НО. При этом хвосты обоих списков _могут_ оказаться EQ между собой, т.е. это будет один и тот же общий хвост. Если над этими двумя возвратами выполнить какую-то деструктивную операцию, неожиданно может измениться и второй список.

den73 ★★★★★
()
Ответ на: комментарий от mv

Действие деструктивных операций на литеральные объекты не определено (в схеме это вообще табу, насколько я помню).

Т.е. (setf (car '(1 2 3)) 8) может где-то проканать, а где-то нет.

cathode
()
Ответ на: комментарий от den73

>> НО. При этом хвосты обоих списков _могут_ оказаться EQ между собой, т.е. это будет один и тот же общий хвост.

И это тоже не определено стандартом, зависит от реализации => надо избегать таких вещей.
Например в ClozureCL `(,x 2 3) экспандится в (LIST* X '(2 3)),
при этом (eq '(2 3) '(2 3)) => nil, хотя с точки зрения оптимизации, могло бы быть true.

Единственное, что можно свободно setf-ить это формы, к которым применимо ",@" , но использовано ","

cathode
()
Ответ на: комментарий от den73

>> С обычной она ожидаема. С апострофом я это узнал только после того, как напоролся.

Вот как раз с обычной квотой (quote) оно совсем не ожидаемо. Почитай HyperSpec на тему quote. Там есть оговорка.

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