Scheme 用于检测方案代码中的引号的函数

Scheme 用于检测方案代码中的引号的函数,scheme,quote,syntax-checking,Scheme,Quote,Syntax Checking,我正在尝试编写一个函数,可以检查某些输入是否是语法检查器的引用 我有以下代码: (define is-quote-expression? (lambda (v) (equal? (car v) 'quote) (is-quotation? (cdr v))))) (define is-quotation? (lambda (v) (or (number? v) (boolean? v) (char? v) (str

我正在尝试编写一个函数,可以检查某些输入是否是语法检查器的引用

我有以下代码:

(define is-quote-expression?
  (lambda (v)
    (equal? (car v) 'quote)
    (is-quotation? (cdr v)))))

(define is-quotation?
  (lambda (v)
    (or (number? v)
        (boolean? v)
        (char? v)
        (string? v)
        (symbol? v)
        (null? v)
        (and (pair? v)
             (is-quotation? (car v))
             (is-quotation? (cdr v)))))
当我尝试评估时,我得到以下结果:

 (is-quote-expression? '1)
 #f

 (is-quote-expression? (cons 'quote 1))
 #t
我想我的助教告诉我,计划环境将所有的“引号”替换为“引号”,但情况似乎并非如此。我们正在实施“小支票”计划

我没有看到什么


提前感谢。

您的代码有几个问题,首先是
中的lambda(pair?v)
部分是quote expression?
几乎肯定是一个错误(您使用名为
pair?
v
的两个参数定义lambda)

另外,我相信您打算在
is quote expression?
中调用
is quote?
仅当
v
不是一对时,因此再次询问
(对?v)是否有意义
中的
是引号吗?
谁说一对是引号,只有当它的
car
cdr
都是引号时

在这里,我相信这就是你的意图:

(define is-quote-expression?
  (lambda (v)
    (if (pair? v)
        (equal? (car v) 'quote)
        (is-quotation? v))))

(define is-quotation?
  (lambda (v)
    (or (number? v)
        (boolean? v)
        (char? v)
        (string? v)
        (symbol? v)
        (null? v))))

您的代码有几个问题,首先是
中的lambda(pair?v)
部分是quote expression?
几乎肯定是一个错误(您使用两个参数定义lambda,分别称为
pair?
v

另外,我相信您打算在
is quote expression?
中调用
is quote?
仅当
v
不是一对时,因此再次询问
(对?v)是否有意义
中的
是引号吗?
谁说一对是引号,只有当它的
car
cdr
都是引号时

在这里,我相信这就是你的意图:

(define is-quote-expression?
  (lambda (v)
    (if (pair? v)
        (equal? (car v) 'quote)
        (is-quotation? v))))

(define is-quotation?
  (lambda (v)
    (or (number? v)
        (boolean? v)
        (char? v)
        (string? v)
        (symbol? v)
        (null? v))))

不过,我同意Óscar的帖子,
是引号表达式吗?
接受一个列表而不是一对,并返回它是否是引号

(define is-quote-expression?
  (lambda (v)
    (and (proper-list-of-given-length? v 2)
         (equal? (car v) 'quote)
         (is-quotation? (cadr v)))))
此外,您最初的问题显示出对报价实际作用的一些困惑。这是真正应该发生的:

> (is-quote-expression? '1)
#f
> (is-quote-expression? (cons 'quote 1))
#f
> (is-quote-expression? (quote 42))
#f
> (is-quote-expression? (quote (quote 42)))
#t

请注意内置quote过程如何简单地返回它所传递的内容。在
(quote 42)
的情况下,它简单地返回
42
。但是
(quote(quote 42))
返回
(quote 42)
,这就是您希望传递给is quote expression的内容?

我同意Óscar的帖子,但是,
is quote expression?
接受一个列表而不是一对,并返回它是否是引号

(define is-quote-expression?
  (lambda (v)
    (and (proper-list-of-given-length? v 2)
         (equal? (car v) 'quote)
         (is-quotation? (cadr v)))))
此外,您最初的问题显示出对报价实际作用的一些困惑。这是真正应该发生的:

> (is-quote-expression? '1)
#f
> (is-quote-expression? (cons 'quote 1))
#f
> (is-quote-expression? (quote 42))
#f
> (is-quote-expression? (quote (quote 42)))
#t

请注意内置quote过程如何简单地返回它所传递的内容。在
(quote 42)
的情况下,它简单地返回
42
。但是
(quote(quote 42))
返回
(quote 42)
,您希望传递给的是quote表达式?

附录中规定了
quote
的行为。对于
'1
,相关规则为6sqv

(存储(sf1…)S1['sqv1])→ (存储(sf1…)S1[sqv1])

是时候把它分解了

S→ “T”表示法定义了计算术语的一个步骤,其中“S”计算为“T”

由于
store
sf1
在左右两侧都是相同的,您不需要理解它们来理解
'1
的计算方式。如果您需要什么,请将
store
视为“存储环境”,将
sfn
视为名称和值对;
(store((x1)(y2))S)
表示在评估术语
S
时,标识符
x
与值
1
关联,而
y
2
关联

如果您不熟悉
S[e]
符号,它指的是一个术语,其中有一个“洞”(一个术语中有一个
[]
)填充
e
。有两个相关的语法元素:有洞的术语(
S[]
)和有值填充洞的术语(
S[e]
)与未命名变量类似。一个重要的区别是一个术语只允许有一个孔。孔可能最好通过示例来解释。以下所有内容都是
S[]

  • (+[]12)
  • (列出一个“foo”)
请注意,孔只能在子项语法有效的情况下出现;
[]2)
不是带孔的术语。
S[0]
将是一个将
0
替换到孔中的术语:

  • (+0112)
  • (列出0'a“foo”)
注意,第二个术语为引号术语提供了两种不同的上下文:
(list[]'a“foo”)
(list'bar[]“foo”)
。这表明您不应该将孔视为未命名的变量

如果你想知道为什么要使用上下文术语和漏洞,它们是递归定义的替代品。没有上下文,→ 必须在术语结构上递归定义(定义结构)。这是结构递归的一个示例,您可以在Scheme中定义任何树处理函数(尽管Scheme语法与用于定义的语法大不相同)→ 和lambda演算代换)

接下来,让我们检查
sqv
的含义,它是“自引用值”的缩写。这是附录a.2中给出的

sqv::=n |#t |#f n::=[数字] sqv只是一个数字或布尔值

总之,6sqv求值规则意味着带引号的数字或布尔值求值为数字或布尔值;引号被简单地丢弃

这对你的家庭作业来说意味着,你无法区分正常函数的
1
'1
之间的区别,因为子项是在调用函数之前计算的。你需要一个宏。

(define (tree-depth tree) (if (pair? tree) (max (tree-depth (car tree)) (tree-depth (cdr tree))) 1 ) ) sqv ::= n | #t | #f n ::= [numbers]