Когда мы можем вкладывать обратные кавычки?
Вы всегда можете вкладывать обратные кавычки.Однако обратите внимание, что этот код не вкладывает их:
`(foo ; in 1 backquote here
,@(cons 'bar ; in 0 backquotes here
`(baz ; in 1 backquotes here
,(random 3))))
Вложенные обратные кавычки выглядят следующим образом:
`(let ((x `(,,y ,z))) ...)
Почему Грэм вкладывает обратные кавычки в этом примере?
Он их не вкладывает.Он генерирует внешнее тело кейса с первыми обратными кавычками, а затем заполняет его кейсами, которые генерируются с помощью mapcar
.Чтобы написать код, который будет сгенерирован для каждого случая, он использует вторую обратную цитату
Почему ,@
расширяет случаи в (random ,(length exprs))
случаях?
Itне делает этогоЭто распространяется на (length exprs)
случаев.Строго говоря, он сливается со списком вещей, возвращаемых тем, что находится внутри него, в данном случае это список выражений.
Я понимаю, что mapcar предназначен в первую очередь для того, чтобы мы могли увеличить ключ, но как этот макрос узнает о применении mapcar всего (random ,(length exprs))
раз?
Это не то, что делает mapcar
или для чего оно.
Как формируется неявный список, который запятая @ создает из сплайсинга?
Это то, что делает mapcar.
Toобратитесь к редактированию, вы получили некоторые вещи наполовину правильно, но у вас слишком много паренов.
mapcar
применяет функцию к каждому элементу списка по порядку, собирая результаты в список:
CL-USER> (mapcar #'1+ '(1 2 3))
(2 3 4)
CL-USER>(let ((key -1))
(mapcar (lambda (x)
`(,incf key) ,x))
'(foo bar (baz wazoo)))
((0 FOO) (1 BAR) (2 (BAZ WAZOO)))
Это будет входить в тело выражения case
: если случайное значение равно 0, вернуть FOO
, если оно равно 1, то BAR
и т. Д.
Toполучите это случайное значение, которое вы делаете (random 3)
для случайного целого числа от 0 до 2 включительно.