Заявка, а не процедура (схема схемы процедуры)

Я пытаюсь написать свою собственную упрощенную процедуру отображения в R5RS. Короче говоря, он принимает процедуру и два списка и возвращает список с результатами процедуры, вызванной для каждой пары объектов в двух списках аргументов, пока один из них не будет пустым.

Это отлично работает для арифметических операторов, таких как:

(map2-rec + '(1 2 3) '(1 2 3 4))

Однако, когда я пытаюсь передать анонимную лямбда-функцию (возвращаемое значение моей процедуры both?), Которая возвращает либо #t, либо #f, это не работает.

(define (map2-rec proc items1 items2)
  (if (or (null? items1) (null? items2))
      '()
      (cons (proc (car items1) (car items2))
            (map2-rec proc (cdr items1) (cdr items2)))))


(define (both? proc)
  (lambda (item1 item2)
    ((if (and (proc item1) (proc item2))
         #t
         #f))))

Конкретная ошибка, которую я получаю в DrRacket:

application: not a procedure;  
expected a procedure that can be
applied to arguments   
given: #t   
arguments...: [none]

Если бы кто-то мог сказать мне, как я могу исправить эту ошибку, я был бы очень счастлив. Я не могу понять, почему этот код не работает сам.

1 ответ

Решение

Есть лишняя (и ошибочная) пара скобок в both?окружающие if выражение. Это должно исправить это:

(define (both? proc)
  (lambda (item1 item2)
    (if (and (proc item1) (proc item2))
        #t
        #f)))

Теперь ваша процедура работает как положено:

(map2-rec + '(1 2 3) '(1 2 3 4))
=> '(2 4 6)
(map2-rec (both? even?) '(1 2 3) '(1 2 3 4))
=> '(#f #t #f)
Другие вопросы по тегам