我想创建一个可以确定方案中任意函数定义的函数。如果我们称这样的函数"定义",它将如此工作:
(define (triple x) (* 3 x))
(definition triple) would return "(triple x) (* 3 x)".
会出现一些实现问题(比如n-arity),但我主要关心的是各个函数的定义是否可以在Scheme中轻松检索。
作为延续,有没有办法创建一个可以确定任意函数参数的函数?这样:
(parameters +)
会返回(number number)
或类似内容。
这些问题都属于如何将函数存储在Scheme中的问题 - 我发现一些声明功能定义与函数名称一起存储的来源,但我无法确定它们的存储方式。< / p>
如果这是不可能的 - 是否有一种语言可以轻松检索函数定义?
答案 0 :(得分:3)
在Scheme中没有类似的东西。但是,单个实现可能具有这种功能。
在Common Lisp中有标准函数function-lambda-expression
,它可能能够检索源代码 - 具体取决于实现。
LispWorks中的示例(重新格式化以提高可读性):
CL-USER 65 > (defun triple (x) (* 3 x))
TRIPLE
CL-USER 66 > (function-lambda-expression #'triple)
(LAMBDA (X)
(DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 42201D392B>))
(DECLARE (LAMBDA-NAME TRIPLE))
(* 3 X))
NIL
TRIPLE
SBCL:
* (defun triple (x) (* 3 x))
TRIPLE
* (function-lambda-expression #'triple)
(SB-INT:NAMED-LAMBDA TRIPLE
(X)
(BLOCK TRIPLE (* 3 X)))
NIL
TRIPLE
正如您所看到的,它返回三个值:代码,无论是闭包还是函数名称。