0


0

スキームの関数呼び出しへのパラメーターの再バインド>

私は少しスキーム初心者で、関数名と式を受け取り、式の最初の引数として関数名をバインドする関数を作成しようとしています。

IE:

何かのようなもの:

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

評価するラムダを生成します

(param '+ 'a "First")

これまでに思いついた最高の:

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

関数名がシンボルであると文句を言うので、これはうまくいかないようです。

これは非常に単純なことだと思いますが、誰かが私を助けてくれると思って、何かが欠けているだけです。

1 Answer


0


まず、コードとデータを混在させています。 Schemeでは似ていますが、同じではありません。 2番目:式には最初の引数がありません。 関数呼び出しのみが最初の引数を持ちます。

したがって、式ではなく、引数リストを持つ関数について説明します。 関数と引数のリストがある場合、変更された引数リストで元の関数を呼び出すバインド関数を書くのは非常に簡単です。 これは次のように行われます。

これは古い関数であり、いくつかの引数を取り、それらを使って何でもします:

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