繁体   English   中英

Racket 中是否有返回过程的 lambda 表达式的函数?

[英]Is there a function in Racket that returns a procedure's 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 中寻找这样的功能。 我已经浏览了Racket 文档,但找不到类似的内容。 (但是,如果我忽略了它,我不会感到惊讶。)Racket 中是否有等价物?

不可以。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\n" my-thunk)
  (printf "exp is ~v\n" (exp-closure-exp my-thunk))
  (printf "result is ~v\n" (my-thunk)))

这产生

fun is #<procedure:...tmp/lambda.rkt:11:19>
exp is '(exp-lambda () (+ 1 2))
result is 3

此宏的更好版本可能会将宏使用的源位置传播到它创建的lambda表达式,或推断名称(请参阅syntax-local-infer-name ),或两者兼而有之。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM