Racket 中是否有 returns 过程的 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 Documentation 但找不到类似的东西。 (但是,如果我忽略了它,我也不会感到惊讶。)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
),或两者。
在 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
。)
您可以使用 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
),或两者。