пытаясь составить схему процедуры - PullRequest
0 голосов
/ 20 марта 2011

пытается создать схему процедуры под названием make-odd-mapper!Предполагается, что это процедура, которая принимает один вход, процедуру и создает процедуру в качестве вывода

ex:

(определите 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 являются частью этого ... кто-нибудь может дать мне несколько разумных строк кода для решения этой проблемы?Было бы полезно, если бы кто-нибудь задумался о мутации ..... и использовал ее для создания процедуры, которая делает процедуру в качестве своего вывода ....

1 Ответ

0 голосов
/ 05 июня 2011

Ну, проблема, поставленная, если коротко, невозможна. Причина в том, что если бы это было возможно, то вы могли бы иметь выражение:

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