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