常见的lisp符号匹配

时间:2012-09-14 07:51:43

标签: lisp common-lisp

我有一个以下形式的列表:

((|* bank accounts| (|account 1| |account 2|))
 (|* airline miles| (|account 1| |account 2|))
 .....
 .....)

我不知道如何使用assoc来访问这些符号,因为它们的两边都是“|”框架。

2 个答案:

答案 0 :(得分:11)

引用的符号与任何其他符号一样,但符号的字符串大小写将被保留:

(assoc '|foo bar| '((|baz| . 1) (|foo bar| . 2))) => (|foo bar| . 2)

以下是一些示例(使用标准读者案例设置):

(intern "foo bar") => |foo bar|

(intern "Foo") => |Foo|

(intern "FOO") => FOO

可以找到更长的答案on cliki。另请参阅2.3.4 Symbols as Tokens中的Common Lisp Hyperspec

答案 1 :(得分:3)

它们的打印方式相同:

> (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"