Я пытаюсь написать свою собственную упрощенную процедуру карты в 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]
Если бы кто-нибудь мог сказать мне, как я могу исправить эту ошибку, я был бы очень рад. Я не могу понять, почему этот код не работает сам.
((if … #t #f))
, так что результат(if … #t #f)
(в данном случае#t
) вызывается как процедура (но это не процедура). - person Joshua Taylor   schedule 18.02.2014(and … …)
уже возвращает логическое значение;(if test #t #f)
эквивалентноtest
. Вы должны использовать(define (both? proc) (lambda (item1 item2) (and (proc item1) (proc item2))))
. - person Joshua Taylor   schedule 18.02.2014and
не обязательно возвращает логическое значение (например:(and 1 2)
) - хотя он отлично работает с примером OP, но если по какой-то причинеboth?
должен возвращать исключительно#t
или#f
, можно использоватьif
- person Óscar López   schedule 18.02.2014#t
или#f
, то(if … #t #f)
- это то, что нужно. Кажется, я припоминаю, что большинство схем были немного строже в отношении того, что все, что не является ложным (#f
в Scheme и()
во многих других Лиспах), является истинным, поэтому я склонен ожидать только, чтоand
возвращает ложь или значение поведения последнего аргумента в Общий Лисп. - person Joshua Taylor   schedule 18.02.2014