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]