Создать имя переменной из строки в Лиспе - PullRequest
11 голосов
/ 15 марта 2011

Я пытаюсь взять строку и преобразовать ее в имя переменной. Хотя я (make-symbol) или (intern) сделал бы это, но, очевидно, это не совсем то, что я хочу, или я использую это неправильно.

Например:

> (setf (intern (string "foo")) 5)
> foo
  5

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

Ответы [ 2 ]

13 голосов
/ 15 марта 2011

Здесь нужно учесть несколько вещей:

  1. SETF не оценивает свой первый аргумент. Ожидается символ или форма, указывающая место для обновления. Вместо этого используйте SET.

  2. В зависимости от винтажа и настроек вашей реализации Common Lisp имена символов могут по умолчанию записываться в верхнем регистре. Таким образом, вторая ссылка на foo может фактически ссылаться на символ, имя которого "FOO". В этом случае вам нужно будет использовать (intern "FOO").

  3. Вызов STRING безвреден, но не нужен, если значение уже является строкой.

Собрав все вместе, попробуйте это:

> (set (intern "FOO") 5)
> foo
  5
7 голосов
/ 16 марта 2011

Использование:

CL-USER 7 > (setf (SYMBOL-VALUE (INTERN "FOO")) 5) 
5

CL-USER 8 > foo
5

Это также работает с переменной:

CL-USER 11 > (let ((sym-name "FOO"))
               (setf (SYMBOL-VALUE (INTERN sym-name)) 3))
3

CL-USER 12 > foo
3

Помните также, что по умолчанию символы создаются внутри как прописные буквы.Если вы хотите получить доступ к символу через строку, тогда вам нужно использовать строку в верхнем регистре.

...