Схема/Рэкет:Сложить с помощью логических значений
-
13-12-2019 - |
Вопрос
(foldr + 0 '(1 2 3 4))
возвращается 10
именно этого я и ожидал, но
(foldr and false '(true true false))
выдает мне ошибку
and: expected an open parenthesis before and, but found none
foldr
принимает функцию (которая принимает два параметра, поскольку у меня есть один список), базовый вариант и список (ы).Я ожидаю, что моя вторая строка кода вернет значение true, если в списке больше нуля логических значений, и все они верны, и я думал, что это сработает именно так.Но, по-видимому, нет.
Решение
And
является специальной формой и не будет работать с foldr
, который ожидает процедура в качестве своего второго аргумента.Попробуйте это вместо этого:
(foldr (lambda (x y) (and x y)) #t '(#t #t #f)) ;#t as base case
Другой альтернативой для этого конкретного случая было бы использование andmap
:
(andmap identity '(#t #t #f))
Другие советы
В системе схемы and
обычно определяется как макросъемка или специальная форма, а не как процедура, поэтому она не работает:
#;1> +
#<procedure C_plus>
#;2> and
Error: unbound variable: and
.