Если код ожидает символ в качестве имени таблицы, вы не можете передать строку, вы должны intern
ее.Должно работать что-то вроде следующего ...
(defparameter x "table-name")
(save-event (intern x) 44 2)
В общем lisp символ - это символ, а строка - это строка.Чтобы получить строку из символа, вам нужно вызвать (symbol-name x)
, чтобы получить символ из строки, вам нужно вызвать (intern x)
.
Квазицитирование (обратное цитирование) не будет выполнять это преобразование.Другими словами:
(let ((test "foo"))
`(this is a ,test))
--> (THIS IS A "foo")`
В зависимости от того, как символ будет использоваться этой библиотекой, может быть даже «неинтернизированный» символ вместо обычного интернированного символа.
Эти символы могут быть созданы с помощью (make-symbol x)
, но если это приемлемо или нет, зависит от того, как символ используется в коде;также обратите внимание, что хотя (intern x)
всегда будет возвращать один и тот же символ, если вы вызываете его несколько раз с одной и той же строкой, это не соответствует действительности для (make-symbol x)
, который вместо этого будет возвращать новый свежий непереданный символ каждый раз, когда вызывается.
(make-symbol "X")
--> #:X
(symbol-name (make-symbol "X"))
--> "X"
(eq (make-symbol "X") (make-symbol "X"))
--> NIL
(eq (intern "X") (intern "X"))
--> T