在racket中是否有一个函数可以返回过程的lambda-expression? [英] Is there a function in Racket that returns a procedure's lambda-expression?

查看:31
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆