Развернуть переменную в списке в LISP - PullRequest
1 голос
/ 03 декабря 2011

Я хотел, чтобы следующий код работал.Как заставить одноуровневые переменные расширяться?

(let* ((data1 10)
       (data2 '(data1 20)))
  (progn data2))

Я ожидал (10 20), но на самом деле я получил (data1 20).Также я хотел бы получить (10 20 (data2)) из следующего:

 (let* ((data1 10)
        (data2 30)
        (data3 '(data 10 20 '(data2)))
   (progn data3))

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Причина, по которой переменная не раскрывается, заключается в том, что вы заключили весь список в кавычки, используя '. ' это не то, как вы создаете списки в lisp, это то, как вы их цитируете (то есть, чтобы они не оценивались).

Чтобы создать список, содержащий содержимое data1 и число 20, просто используйте (list data1 20).

1 голос
/ 03 декабря 2011

Как сказал sepp2k, обычным способом создания списков во время выполнения является функция list. Списки в кавычках - это литералы списков, литеральных значений.

Но есть и другой способ создания списков во время выполнения, который больше похож на цитируемые списки, обратная цитата. Вы можете достичь того, что вы хотите с

`(,data1 20)

Еще одна вещь, касающаяся ваших примеров: вам не нужны progn s. progn предназначен для упорядочения нескольких выражений с последующим возвращением значения последнего из них, если это просто выражение с одним значением, вы можете просто использовать его без переноса. Но даже если бы у вас было несколько выражений, вам не нужно было бы использовать progn в этом случае, потому что let* неявно помещает progn вокруг тела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...