将参数重新绑定到方案中的函数调用>

时间:2010-10-24 19:07:24

标签: scheme

我是一个方案新手,我正在尝试编写一个带有函数名称的函数,以及一个表达式并将函数名称绑定为表达式的第一个参数。

IE:

类似的东西:

(bind-function-name '+ '(param 'a "First"))

会生成一个评估

的lambda
(param '+ 'a "First")

迄今为止我最好的想法:

(define (bind-function-name name cmd) 
  (let ((func (car cmd)) (args (cdr cmd)))
    (lambda ()
      (apply func (cons name args)))))

这似乎不起作用,因为它抱怨函数名称是一个符号。

我确信这很简单,但我只是错过了一些东西,以为有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

首先:您正在混合代码和数据。它在Scheme中看起来很相似,但它不一样。 第二:表达式没有第一个参数。只有函数调用才有第一个参数。

所以你不要谈论一个表达式,而是一个带有参数列表的函数。如果你有一个函数和一个参数列表,那么编写一个bind函数就很容易了,它使用一个修改过的参数列表来调用原始函数。它是这样做的:

这是一个旧函数,它接受一些参数并做任何事情 和他们一起:

(define (old-func . args)
  (display "old-func: ")
  (write args)
  (newline))

(old-func 1 2 3) -> old-func: (1 2 3)

这是绑定函数,它采用旧函数和新函数 first-argument并返回一个调用old函数的新函数 使用修改后的参数列表。

(define (bind-func first-arg old-func)
  (lambda args
    (apply old-func (cons first-arg args))))

这就是它的工作方式:

(define new-func (bind-func "new" old-func))
(new-func 1 2 3) -> old-func: ("new" 1 2 3)