Зацикливание переменных в Лиспе - PullRequest
5 голосов
/ 28 января 2009

Я написал функцию

(defun test ()
  (let ((str1 "foo") (str2 "bar"))
    (loop for s in '(str1 str2) do (message s))))

но это не работает. Сообщение Elisp Backtrace :

Введен отладчик - ошибка Lisp: (неверный аргумент типа stringp str1)

Как я могу заставить это работать?

P.S .: следующая модифицированная версия работает отлично, но мне нужна оригинальная версия

(defun test1 ()
  (loop for s in '("asdf" "fdsa") do (message s)))

Ответы [ 3 ]

16 голосов
/ 28 января 2009

Оператор quote (для которого апостроф является синтаксическим сахаром) означает, что его аргументы не оцениваются, т.е. (quote (str1 str2)) возвращает список из двух символов . Вместо этого используйте list: (list str1 str2).

6 голосов
/ 31 января 2009

Построить список значений:

(defun test ()
  (let ((str1 "foo") (str2 "bar"))
    (loop for s in (list str1 str2) do (message s))))
3 голосов
/ 28 января 2009

попробовать:

`(,str1 ,str2)
...