2012-09-14 135 views
2

我有以下形式的ALIST:Common Lisp的符号匹配

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

我也不怎么用assoc访问符号,因为他们是在两侧框架“|”。

回答

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。请参阅Common Lisp Hyperspec中的2.3.4 Symbols as Tokens

+1

它是这样,让我......在编译alist时使用(string-upcase)所有元素来解决它。 – momo

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-情况下,读取符号将大写:

> 'foo 
FOO 

但是:

> (intern "1234") 
|1234| ; 
NIL 
> (type-of *) 
SYMBOL 
> '|foo bar baz| 
|foo bar baz| 
> (symbol-name *) 
"foo bar baz"