理解scheme中的符号

理解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

你能帮助我理解为什么在下面表达式的值中有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-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)
。看到区别了吗