【问题标题】:Possible to return a let* function in Scheme Dr Racket?可以在 Scheme Dr Racket 中返回 let* 函数吗?
【发布时间】:2021-12-09 12:53:55
【问题描述】:

我正在通过一个项目来更好地理解 Scheme。我的方案项目的目标是获取以下箭头左侧的输入并生成右侧的输出:

(* (+ 1 a) (+ 1 a))
 ==>
(let* ((g128572 (+ 1 a)))
  (* g128572 g128572))

要准确详细说明程序中需要发生的事情,需要生成一个 let*。 let 的绑定将是一系列随机生成的“变量”字符串,这些字符串具有与之关联的值。该值来自输入的左侧。任何出现不止一次的东西都会出现在 let 绑定中。 let 的主体将是插入了变量名的表达式,而不是表达式。

我的问题如下:

是否只能以下面代码返回的形式返回?

(define (example)
  (cons 'let* (cons '((g128572 (+ 1 a)))
              (cons '(* g128572 g128572)
                    '()))))

返回值是'(let* ((g128572 (+ 1 a))) (* g128572 g128572)),从技术上讲,它是一个列表,需要采用(eval '(let* ((g128572 (+ 1 a))) (* g128572 g128572))) 的形式才能实际评估,或者我可以实际返回函数本身,我需要拥有的一切是(let* ((g128572 (+ 1 a))) (* g128572 g128572)),它会成功运行并自行评估?

希望我清楚我在问什么。

【问题讨论】:

  • 你的意思是在你的例子中写(+ a 1)(+ 1 a)吗?
  • 哦,哎呀。应该都是同一个表达式。

标签: scheme racket


【解决方案1】:

在 mit-scheme 中没有唯一的变量名生成器。你必须自己实现。

你想要做的实际上被命名为converting the code in CPS。为此,您不需要太多的哲学,这很简单。

只需谷歌,看看如何使用 lambda-generators 实现 CPS 转换,而不是 let*。弗里德曼的书或者​​克里希那穆提的课程就足够学了。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2010-10-17
    • 2011-05-30
    • 2015-01-08
    • 2017-10-14
    相关资源
    最近更新 更多