使用 Abstract/Concrete 语法创建序列(方案)
Sequence Creation With Abstract/Concrete Syntax (Scheme)
首先,这是作业。我无意获得完整的解决方案,但我对如何解释这个问题感到困惑。
我们基本上是从词法分析器和解析器为我们在 class 中创建的语言制作解释器。
具体来说,我所坚持的是使用 Scheme/Drracket 来实现使用调用方法 "make-seq" 的解析器创建序列,该方法可以由以下规则定义:
(make-seq (e)) = e
(make-seq (e1 e2 ... en)) = (make-let '*temp* e1 (make-seq (e2 ... en)))
make-let定义为:
(define (make-let var exp1 exp2)
(list 'let var exp1 exp2))
我已经实现了下面的 make-seq 方法:
(define (make-seq e)
(if (null? (cdr e))
e
(make-let '*temp* (car e) (make-seq (cdr e)))))
但我不确定如何在上面的规则中表示'temp。我相当确定我不应该在实现中实际使用符号 'temp ,但我不确定我应该在那里做什么。
任何人都可以就我应该如何推进这个问题给我一些建议吗?
谢谢!
使用 *temp
不会有问题,除非它正在解释的程序也有 *test
:
(let ((*temp 10))
(seq
expression1
(* *temp *temp))) ; end up using the result from the previous element in the sequence
要解决此问题,您可以引入可用于解释器但无法在代码中创建的变量。我经常使用第一个元素是特殊值的符号和列表。您的 make-seq
创建了它,您的解释器也需要将它们视为符号。通常解释器使用 eq?
所以基本上每个创建为带有标签的列表的结构对于该扩展都是唯一的,使得每个嵌套 *temp
甚至不会打扰之前创建的其他结构。
首先,这是作业。我无意获得完整的解决方案,但我对如何解释这个问题感到困惑。
我们基本上是从词法分析器和解析器为我们在 class 中创建的语言制作解释器。
具体来说,我所坚持的是使用 Scheme/Drracket 来实现使用调用方法 "make-seq" 的解析器创建序列,该方法可以由以下规则定义:
(make-seq (e)) = e
(make-seq (e1 e2 ... en)) = (make-let '*temp* e1 (make-seq (e2 ... en)))
make-let定义为:
(define (make-let var exp1 exp2)
(list 'let var exp1 exp2))
我已经实现了下面的 make-seq 方法:
(define (make-seq e)
(if (null? (cdr e))
e
(make-let '*temp* (car e) (make-seq (cdr e)))))
但我不确定如何在上面的规则中表示'temp。我相当确定我不应该在实现中实际使用符号 'temp ,但我不确定我应该在那里做什么。
任何人都可以就我应该如何推进这个问题给我一些建议吗?
谢谢!
使用 *temp
不会有问题,除非它正在解释的程序也有 *test
:
(let ((*temp 10))
(seq
expression1
(* *temp *temp))) ; end up using the result from the previous element in the sequence
要解决此问题,您可以引入可用于解释器但无法在代码中创建的变量。我经常使用第一个元素是特殊值的符号和列表。您的 make-seq
创建了它,您的解释器也需要将它们视为符号。通常解释器使用 eq?
所以基本上每个创建为带有标签的列表的结构对于该扩展都是唯一的,使得每个嵌套 *temp
甚至不会打扰之前创建的其他结构。