Вызов `and` в списке аргументов - PullRequest
2 голосов
/ 09 июля 2020

Есть ли способ вызвать and или or к списку аргументов? Например,

(and (list #t #t #f))

?

Я пытался написать (apply and (list #t #t #f)), но это не сработало.

Ответы [ 3 ]

4 голосов
/ 09 июля 2020

Попробуйте ormap и andmap

(ormap values (list #t #t #f))
(andmap values (list #t #t #f))

, где values по сути является функцией идентификации в этом контексте .

Причина, по которой (apply and (list #t #t #f)) не работает, заключается в том, что and не является функцией. Это макрос, который необходим, потому что (and #f (error 'foo)) должен закоротить (оценивается как #f). Если бы это была функция, это привело бы к ошибке.

0 голосов
/ 09 июля 2020

Основываясь на предыдущем ответе. Бедняк поступил бы так.

 > (ormap (lambda (x) (not (false? x))) (list #t #t #f))
 ## #t

 > (andmap (lambda (x) (not (false? x))) (list #t #t #f))
 ## #f
0 голосов
/ 09 июля 2020

Вы можете использовать any? и all? из библиотеки relation (раскрытие: я автор):

(require relation)

(any? (list #t #t #f)) ;=> #t
(all? (list #t #t #f)) ;=> #f
...