【问题标题】:Rebinding parameters to a function call in scheme>将参数重新绑定到方案中的函数调用>
【发布时间】:2010-10-24 19:07:23
【问题描述】:

我是一个方案新手,我正在尝试编写一个函数,该函数接受一个函数名和一个表达式,并将函数名绑定为表达式的第一个参数。

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)))))

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

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

【问题讨论】:

  • 可以叫它(bind-function-name '+ (list param 'a "First"))吗?
  • 确实有效,有什么办法可以将它与引用的第二个参数一起使用以减少冗长?
  • 好吧,你总是可以使用准引用:`(,param a "First")

标签: scheme


【解决方案1】:

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

因此,您谈论的不是表达式,而是带有参数列表的函数。如果你有一个函数和一个参数列表,那么编写一个绑定函数非常容易,它使用修改后的参数列表调用原始函数。这样做是这样的:

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

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

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

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

(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多