我看到了几个append向列表实现元素的例子,但都没有使用尾递归.如何在功能风格中实现这样的功能?
(define (append-list lst elem) expr)
Run Code Online (Sandbox Code Playgroud) lisp scheme tail-call-optimization racket tailrecursion-modulo-cons
所以,据我了解,以下内容:let,let*,letrec并letrec*在方案/球拍使用人工合成的糖.
现在,如果我有一个简单的程序:
(let ((x 1)
(y 2))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
它被翻译成:
((lambda (x y) (+ x y)) 1 2)
Run Code Online (Sandbox Code Playgroud)
如果我有:
(let* ((x 1)
(y 2))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
它被翻译成:
((lambda (x) ((lambda (y) (+ x y))) 2) 1)
Run Code Online (Sandbox Code Playgroud)
现在,对于我的第一个问题,我理解一个letrec表达式的含义,它允许一个人在let中使用递归,但我不明白它是如何完成的.什么是letrec翻译成?
例如,会是什么
(letrec ((x 1)
(y 2))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
被翻译成?
第二个问题是类似的letrec*- 但letrec*我不明白它究竟有何不同letrec?而且,letrec*表达式将被翻译成什么?
我有一个与方案相关的问题,我们如何实现let*作为lambda表达式.更确切地说,我并不想知道"常规"允许,但是让我们使用*让我们使用一个让表达式在另一个中.
(let ((x 2) (y 3)
(let ((x 7)
(z (+ x y)))
(* z x)))
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,为什么答案35,而不是70?在第二个let,x是7所以z应该是7 + 3 = 10,然后结果应该是7*10 = 70.我知道另一个是让*我在这之间非常混乱2.样本是谷歌的抓取.我已经google但是无法得到它.
我正在为GIMP编写一个脚本,并let*在我拍摄的样本中使用它.但它似乎只是一种lambda糖let.他们为什么不同?他们之间有什么区别?
今天我试着理解如何让我们在Scheme/Racket中使用lambda演算的上下文,但是我无法弄清楚如何将let的等效写为lambda函数.
我认为它的一般形式应该是这样的:
((lambda (p1 p2...) body) v1 v2...)
Run Code Online (Sandbox Code Playgroud)
但绝对不是一个完整的函数定义.
对此有正确/完整定义的想法吗?
先感谢您!