如何从Scheme中的参数读取和运行过程?

时间:2016-03-12 11:04:05

标签: parsing functional-programming scheme procedure

是否可以将过程定义作为参数提供,然后以某种方式在程序中运行它?例如,如果我拨打vapply。如何从参数中读取过程?我花了几个小时在上面,因为我是Scheme的新手,所以无法找到任何解决方案。 感谢

2 个答案:

答案 0 :(得分:1)

函数是Scheme中的一等公民:它们是可以像更传统的数据类型一样传递的值,并且可以使用参数名称,就好像有一个定义了该名称的函数一样以传统的方式。

如果您以正常方式定义了一个函数(使用define),那么您只需传递名称即可。但是你也可以使用lambda创建一个函数 object ,它可以像任何其他值一样使用(绑定到名称,作为参数传递)以及它的类似函数的能力(即适用于参数)。

以下是等效的:

(define (plus a b) (+ a b))
(define plus_a (lambda (a b) (+ a b)))

如果您有以下内容(请注意op的使用方式):

(define (do_op op a b) (op a b))

然后这些也相当于彼此:

(do_op + 5 6)
(do_op plus 5 6)
(do_op plus_a 5 6)
(do_op (lambda (a b) (+ a b)) 5 6)

答案 1 :(得分:0)

对于Scheme,您只需传递lambda定义,如(lambda (n) (* n n)),例如

(define (display-result procedure value)
  (display (procedure value))

(display-result (lambda (n) (* n n)) 5) ; displays 25

如果某个过程绑定了一个名称,如+或用define定义,则只需使用该名称代替lambda表达式。

如果您正在翻译某种语言,那么您需要自己通过管理自己的环境来实现此功能。这并不简单,如果你是新手,那么完成它需要花费数小时。我建议观看SICP videos