我是一个方案新手,我正在尝试编写一个带有函数名称的函数,以及一个表达式并将函数名称绑定为表达式的第一个参数。
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)))))
这似乎不起作用,因为它抱怨函数名称是一个符号。
我确信这很简单,但我只是错过了一些东西,以为有人可以帮助我。
答案 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)