gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:42:44 25 4
gpt4 key购买 nike

在 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 Documentation但我找不到类似的东西。 (不过,如果我忽略了它,我不会感到惊讶。)在 Racket 中是否有等价物?

最佳答案

Racket 号lambda产生一个不记得其 S 表达式(或语法对象)形式的闭包。它通常会记住它的名称(或它的缩写源位置,如果无法推断名称),这通常足以帮助调试。 (见 object-name。)

您可以构建自己的 lambda 变体具有此功能,使用 Racket 的适用结构和简单的宏。这是一个基本示例:

#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),或两者兼而有之。

关于lambda - Racket 中是否有返回过程的 lambda 表达式的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60014817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com