Разрешение символов в списке Common Lisp - PullRequest
3 голосов
/ 18 ноября 2010

Предположим, у меня есть функция

CL-USER> (defun trimmer (seq) "This trims seq and returns a list"
      (cdr 
         (butlast seq)))
TRIMMER
CL-USER> (trimmer '(1 2 3 VAR1 VAR2))
(2 3 VAR1)
CL-USER> 

Обратите внимание, что из-за QUOTE VAR1 и VAR2 не разрешаются. Предположим, я хочу разрешить символы VAR1 и VAR2 к их значениям - есть ли стандартная функция для этого?

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

Не используйте quote для создания списка с переменными; используйте list вместо:

CL-USER> (trimmer (list 1 2 3 var1 var2))
(2 3 value-of-var1)

(где value-of-var1 - значение var1).

Quote только предотвращает оценку любого аргумента. Если его аргумент оказывается литералом списка, то он возвращается. Однако для создания списков, которые не являются просто литералами, используйте list. Вы можете использовать синтаксис обратных кавычек, но это довольно запутанно в таком случае.

4 голосов
/ 18 ноября 2010

Обратная кавычка - это обычный способ интерполировать значения в цитируемый список:

> (setq var1 4 var2 5)
5
> `(1 2 3 ,var1 ,var2)
(1 2 3 4 5)

Отредактировано, чтобы добавить: если вы хотите обработать список так, чтобы символы заменялись на их symbol-value, то вам нужна функция примерно такая:

(defun interpolate-symbol-values (list)
  "Return a copy of LIST with symbols replaced by their symbol-value."
  (loop for x in list
        collect (if (symbolp x) (symbol-value x) x)))

> (interpolate-variables '(1 2 3 var1 var2))
(1 2 3 4 5)

Однако это кажется странной вещью, которую хочется сделать. Можете ли вы сказать больше о том, чего вы пытаетесь достичь? Почти наверняка есть лучший способ сделать это, чем этот.

...