确定解释器中Scheme函数的定义和参数? /如何将函数存储在Scheme中?

时间:2014-09-13 20:56:00

标签: scheme lisp

我想创建一个可以确定方案中任意函数定义的函数。如果我们称这样的函数"定义",它将如此工作:

(define (triple x) (* 3 x))

(definition triple) would return "(triple x) (* 3 x)".

会出现一些实现问题(比如n-arity),但我主要关心的是各个函数的定义是否可以在Scheme中轻松检索。

作为延续,有没有办法创建一个可以确定任意函数参数的函数?这样:

(parameters +)会返回(number number)或类似内容。

这些问题都属于如何将函数存储在Scheme中的问题 - 我发现一些声明功能定义与函数名称一起存储的来源,但我无法确定它们的存储方式。< / p>

如果这是不可能的 - 是否有一种语言可以轻松检索函数定义?

1 个答案:

答案 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

正如您所看到的,它返回三个值:代码,无论是闭包还是函数名称。