理解scheme中的符号
你能帮助我理解为什么在下面表达式的值中有7个符号(包括重复符号)吗理解scheme中的符号,scheme,Scheme,你能帮助我理解为什么在下面表达式的值中有7个符号(包括重复符号)吗 '('a ',(string->symbol "b") 'c)) 您可以编写一个函数来检查元素是否为符号。 为清晰起见,将元素与其“符号”配对: (define (sym-check ls) (cond ((null? ls) '()) ((not (pair? ls)) (cons ls (symbol? ls))) ((pair? (car ls)) (cons (map sym
'('a ',(string->symbol "b") 'c))
您可以编写一个函数来检查元素是否为符号。
为清晰起见,将元素与其“符号”配对:
(define (sym-check ls)
(cond ((null? ls) '())
((not (pair? ls)) (cons ls (symbol? ls)))
((pair? (car ls)) (cons (map sym-check (car ls)) (sym-check (cdr ls))))
(else (cons (sym-check (car ls)) (sym-check (cdr ls))))))
> (sym-check '('a ',(string->symbol "b") 'c))
'(((quote . #t) (a . #t)) ((quote . #t)
((unquote . #t)
((string->symbol . #t) ("b" . #f))))
((quote . #t) (c . #t)))
你得到七个#t
s.请注意,
”
和,
是符号quote
和unquote
的“速记”
> (quote (unquote (string->symbol "b")))
',(string->symbol "b")
使用list
而不是引用会产生非常不同的结果:
> (sym-check (list 'a ',(string->symbol "b") 'c))
'((a . #t) ((unquote . #t) ((string->symbol . #t) ("b" . #f))) (c . #t))
这与将报价从报价单中删除相同:
> (sym-check '(a ,(string->symbol "b") c))
'((a . #t) ((unquote . #t) ((string->symbol . #t) ("b" . #f))) (c . #t))
<代码>'('a',(字符串->符号“b”)'c))计算为以下结构:
((quote a)
(quote (unquote (string->symbol "b")))
(quote c))
我能数到7,所以是的。计算引用表达式的结果中有7个符号
Scheme系统有一个读卡器,可以将'x
翻译成(quote x)
,,`
,和,@
对应于带有准单字
,取消报价
和取消报价拼接
的表单。这意味着代码`(abc,def)
变为(quasikote(abc(unquote d)ef))
。然后,实现中的macos将其转换为(list*'a'b'cd'(ef))
或执行相同操作的类似表达式。但是,对于“`(abc,def)
只会变成值(quasikote(abc(unquote d)ef))
,因为这是引用的表达式。Scheme不会扩展为普通的引号表达式
通常引用数据中的引用字符是一个错误。初学者不理解它的用途,它需要无处不在。但实际上你只需要外部报价<代码>(+45)
是9
,”(+45)
是(+45)
。看到区别了吗