Заявка, а не процедура (схема схемы процедуры)
Я пытаюсь написать свою собственную упрощенную процедуру отображения в 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)