在racket中是否有一个函数可以返回过程的lambda-expression? [英] Is there a function in Racket that returns a procedure's lambda-expression?
本文介绍了在racket中是否有一个函数可以返回过程的lambda-expression?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在Common Lisp的一个变体(我认为是CMUCL,但我可能错了-我再也找不到它了)中,有一个函数(我认为)叫做function-lambda-expression
。如果它得到一个过程,它将打印出生成它的lambda表达式。示例:
(let ((my-thunk (lambda () (+ 1 2))))
(write my-thunk)
(write (function-lambda-expression my-thunk)))
这将打印如下内容:
#<PROCEDURE>
(LAMBDA () (+ 1 2))
它对调试和探索该语言非常有用。
我正在找一个像这样的球拍函数。我已经翻遍了Racket Documentation,但我找不到任何类似的东西。(然而,如果我忽视了这一点,我也不会感到惊讶。)球拍中有等价物吗?
推荐答案
否。racket的lambda
生成一个不记得其S表达式(或语法对象)形式的闭包。它通常会记住其名称(如果无法推断名称,则记住其缩写的源位置),这通常足以帮助调试。(请参见object-name
。)
您可以使用racket的适用结构和一个简单的宏,构建您自己的具有此功能的lambda
变体。这里有一个基本示例:
#lang racket
(struct exp-closure (f exp)
#:property prop:procedure (struct-field-index f))
(define-syntax-rule (exp-lambda formals . body)
(exp-closure (lambda formals . body)
(quote (exp-lambda formals . body))))
(let ([my-thunk (exp-lambda () (+ 1 2))])
(printf "fun is ~v
" my-thunk)
(printf "exp is ~v
" (exp-closure-exp my-thunk))
(printf "result is ~v
" (my-thunk)))
这会产生
fun is #<procedure:...tmp/lambda.rkt:11:19>
exp is '(exp-lambda () (+ 1 2))
result is 3
此宏的更好版本可能会将宏使用的源位置传播到它创建的lambda
表达式或推断的名称(请参阅syntax-local-infer-name
),或者两者都传播。
这篇关于在racket中是否有一个函数可以返回过程的lambda-expression?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文