scheme语言中的符号操作
本节引入了符号操作:为数据对象加引号的能力,在scheme语言中,可以使用单引号,将表和符号标记为应该作为数据对象看待。
例如:
(define a 1)
(define b 2)
(list a b)
(1 2)
(list 'a 'b)
(a b)
(list 'a b)
(a 2)
(car '(a b c))
a
(cdr '(a b c))
(b c)
练习2.53 求值下面各个表达式时将打印出什么
点击查看代码
(list 'a 'b 'c) -> (a b c)
(list (list 'george)) -> ((george))
(cdr '((x1 x2)(y1 y2))) -> ((y1 y2))
(cadr '((x1 x2)(y1 y2))) -> (y1 y2)
(pair? (car '(a short list))) -> #f
(memq 'red '((red shoes) (blue socks))) -> #f
(memq 'red '(red shoes blue socks)) -> (red shoes blue socks)
练习2.54 从符号相等的基本eq?出发,以递归的方式定义出equal?。 如何判断a和b是equal?的:如果均为符号,且满足eq?;或者都是表,且(car a)和(car b)相互满足equal?,并且(cdr a)和(cdr b)相互满足equal?。
点击查看代码
(define (equal? a b)
(cond ((and (null? a) (null? b)) #t)
((and (symbol? a) (symbol? b)) (eq? a b))
((and (pair? a)(pair? b))
(and ((equal? (car a) (car b))
(equal? (cdr a) (cdr b)))))
(else #f)))
练习2.55 Eva Lu Ator输入了表达式:
(car ''abracadabra)
解释器打印出了quote,请解释。
解:在前文的备注中有提到,在scheme语言中'会被表达为quote,该表达式可以表达为(car '(quote abracadabra)),因此表达出的就是quote。

浙公网安备 33010602011771号