Как запустить и на булевых списках в схеме? - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю над отображением списка для логики преформ c, чтобы принимать решения, и постоянно удивляюсь, создавая что-то вроде этого:

((#t #t #f)(#t #t #t)(#t #t #t)(#f #t #t)(#t #f #t))

Что мне нужно, так это измените приведенный выше список на

(#f #t #t #f #f)

У меня была мысль, используя and, что бы сделать логи c Я хочу; (and #f #t #t) ⇒ #f. Но я не уверен, как перемещать списки логических значений, чтобы я мог запустить and для них. Я думал об использовании apply, но это не сработало:

(apply and '(#t #t #f))
While compiling expression:
Syntax error:
unknown location: source expression failed to match any pattern in form and

Есть ли способ запустить and для логических значений в списке?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020
(define input '((#t #t #f)(#t #t #t)(#t #t #t)(#f #t #t)(#t #f #t)))

(map (lambda (a) (every (lambda(x) x) a))
     input)
0 голосов
/ 09 февраля 2020

Поскольку and - это специальная форма, а не процедура , нам нужно сделать что-то подобное (используя map и foldl ):

(define lst '((#t #t #f) (#t #t #t) (#t #t #t) (#f #t #t) (#t #f #t)))

(map (lambda (sl)
       (foldl (lambda (e acc) (and e acc)) #t sl))
     lst)

=> '(#f #t #t #f #f)

На некоторых диалектах Схемы (например, Ракет) мы можем написать еще более простое выражение, воспользовавшись curry, identity и andmap:

(map (curry andmap identity) lst)
=> '(#f #t #t #f #f)
...