我有一个如下形式的列表:
((|* bank accounts| (|account 1| |account 2|))
(|* airline miles| (|account 1| |account 2|))
.....
.....)
我不知道如何使用assoc
来访问这些符号,因为它们的两边都用“|”框住了。
我有一个如下形式的列表:
((|* bank accounts| (|account 1| |account 2|))
(|* airline miles| (|account 1| |account 2|))
.....
.....)
我不知道如何使用assoc
来访问这些符号,因为它们的两边都用“|”框住了。
带引号的符号被视为与任何其他符号一样,但保留了符号的字符串大小写:
(assoc '|foo bar| '((|baz| . 1) (|foo bar| . 2))) => (|foo bar| . 2)
以下是更多示例(使用标准阅读器案例设置):
(intern "foo bar") => |foo bar|
(intern "Foo") => |Foo|
(intern "FOO") => FOO
更长的答案可以在 cliki 上找到。另请参阅Common Lisp Hyperspec中的2.3.4 Symbols as Tokens。
它们的打印方式相同:
> (defparameter *alist*
'((|* bank accounts| |account 1| |account 2|)
(|* airline miles| |account 1| |account 2|)))
*ALIST*
> (cdr (assoc '|* bank accounts| *alist*))
(|account 1| |account 2|)
> (cdr (assoc '|* airline miles| *alist*))
(|account 1| |account 2|)
竖线只是多个转义字符,允许使用标准阅读器不会读取为符号的字符。例如,空格会在标准阅读器语法中产生单独的符号:
> (read-from-string "foo bar")
FOO ;
4
数字不会产生符号:
> (read-from-string "123 456")
123 ;
4
> (type-of *)
(INTEGER 0 16777215)
如果没有转义和默认的 readtable-case,读取的符号将是大写的:
> 'foo
FOO
但:
> (intern "1234")
|1234| ;
NIL
> (type-of *)
SYMBOL
> '|foo bar baz|
|foo bar baz|
> (symbol-name *)
"foo bar baz"