В Лиспе, как вы получаете значение выражения? - PullRequest
0 голосов
/ 06 декабря 2011

Будет напечатано data, но я хочу, чтобы оно напечатало show.Я хочу напечатать значение, а не выражение, как бы я это сделал?

(defun display (x)
  (list x))

(setq temp 'data)
(set temp 'show)
(display 'data)

что если вы не знаете, связана ли переменная или нет?Я должен написать функцию, которая принимает ключ и значение, если ключ не существует, то я должен сделать значение ключа setq, если ключ уже существует, то я бы добавил значение к ключу.В этом случае, если я делаю (значение ключа сохраненных данных), если значение не было ограничено, я получаю несвязанную ошибку, как бы я обработал этот случай?

например, если нет mydata и я делаю(значение сохраненных данных mydata), тогда mydata станет (значение), теперь, если я делаю (сохраненные данные value2 mydata), тогда mydata становится (значение value2).

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Цитирование списка или символа в Лиспе с помощью ' в точности эквивалентно использованию специальной формы (quote ...).Это специально для того, чтобы сделать оценку процитированной вещи , а не .'data в коде на Лиспе или введенный в REPL - то же самое, что и (quote data), и оценивается как символ data.

data без кавычки - в значение переменная data в текущей области видимости.Таким образом, в REPL:

[1]> (setq data 14)
14
[2]> data
14

Первое выражение также оценивается как 14, потому что setq возвращает значение связанной переменной (в этом отношении действует как оператор присваивания = в C).

То, что вы сделали в приведенном выше коде, - это установите переменную с именем temp, содержащую символ data, а затем, используя set (без setq), установитепеременная с именем data символу show.Это немного похоже на использование мягких ссылок в Perl (например), но я не думаю, что оно особенно широко используется или рекомендуется в качестве техники Lisp.

Кстати, ваша display процедура, вероятно, вероятноне делать то, что вы думаете: он возвращает список из одного элемента того, что вы передаете ему.Тот факт, что значение печатается при вводе его в REPL, объясняется тем, что значение любое выражение печатается в REPL.Для отображения значения в программе вы можете использовать print или, возможно, формат .(Я предполагаю, что вы используете Common Lisp, поскольку он, очевидно, не Scheme, но, возможно, это какой-то другой вариант Lisp, и в этом случае эта ссылка не поможет.)

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

Вы цитируете data. Если вы хотите, чтобы его оценили, просто позвоните

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