0

make-odd-mapper というスキーム プロシージャを作成しようとしています! 1つの入力、プロシージャを受け取り、出力としてプロシージャを生成するプロシージャであると想定されています

元:

(定義 i4 (mlist 10 2 30 4))

(i4)

{10 2 30 4}

((make-odd-mapper! add-one) i4)

i4

{11 2 31 4}

問題が入力リストとその set-mcar を変更する必要があることはわかっています。および void はその一部です...誰かがこれを解決するための合理的なコード行を教えてくれますか? 誰かが突然変異について疑問に思っている場合に役立ちます...そしてそれを使用して、プロシージャを出力として作成するプロシージャを作成します....

4

1 に答える 1

0

さて、提示された問題は、簡単に言えば、不可能です。その理由は、可能であれば、次の式を使用できるからです。

(make-odd-mapper! add-one)

これは、部分適用によって作成された関数の関数になります。ただし、この関数はそのオペランドを変更する必要があり、これはマクロによってのみ行うことができます。したがって、その関数の結果はマクロになりますが、マクロは値として存在しないため、これは不可能です。ただし、 の定義を少し変更することで、make-odd-mapper!少し異なることを行うことができます。この場合、元の質問とまったく同じように使用しますが、言う代わりに

((make-odd-mapper! add-one) i4)

あなたは言うでしょう

(make-odd-mapper! add-one i4)

この方法でそれを行うコードは次のとおりです。

;;; Applies its argument to every other element of a list.
(define map-every-other
  (lambda (function lis)
    (let map-every-other ((function function) (lis lis) (acc '()) (other #t))
      (if (null? lis)
      acc
      (map-every-other
       function
       (cdr lis)
       (append acc (list (if other (function (car lis)) (car lis))))
       (not other))))))

;;; This function does the odd mapping, but returns
;;; the new function instead of mutating the original.
(define make-odd-mapper
  (lambda (function-to-apply)
    (lambda (function)
      (lambda ()
        (map-every-other function-to-apply (function))))))

;;; This macro mutates the original function by using make-odd-mapper
(define-syntax make-odd-mapper!
  (syntax-rules ()
    ((_ function-to-apply function)
     (begin
       (set! function
         ((make-odd-mapper function-to-apply) function))))))
于 2011-06-05T17:03:58.180 に答える