Использование «и» в схеме - PullRequest
0 голосов
/ 07 июля 2010

Эй, я пытаюсь использовать and в cond выражении.По сути, вместо простой проверки того, что <exp1> истинно, перед запуском некоторого кода, мне нужна схема, чтобы проверить, что <exp1> И <exp2> истинны.Я понимаю, что (and #t #f) оценивается в #f, а (and (= 10 (* 2 5)) #t) оценивается в #t.К сожалению, Схема не примет

(and (eqv? (length x) 1) (eqv? (car x) #t))

, где x - это список, первый элемент которого является S-выражением, которое оценивается либо в #t, либо в #f (на самом деле, я просто хотел(and (eqv? (length x) 1) (car x)), но это не сработало).

Может кто-нибудь объяснить, что я делаю неправильно, или как это исправить?Кстати, кто-нибудь знает, что означает ... на схеме, если что?Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

"где x - это список, первый элемент которого является S-выражением, которое оценивается как #t или #f (на самом деле, я просто хотел сделать (и (eqv? (Длина x) 1) (машина x)), но это не сработало. "

Во втором случае (car x), вы просто получаете первый элемент в списке, вы не оцениваете его.

Скажите свой списокx - это список ((eq? 3 3)), я просто что-то говорю. Его длина равна 1, и его первый элемент оценивается как #t , если мы оцениваем его , но (car x) в этом случае возвращает list (eq? 3 3), который представляет собой список из одного символа и двух чисел.

Решением вашей проблемы будет использование eval, как в (eval (car x) (null-environment)), который оценивает данные,например, список.

Если вы используете ((car x)), как указано в другом ответе, это будет работать только в том случае, если ваш первый элемент списка является thunk, нулевым, если вы создали x путем оценки списка (list (lambda () #t)).

В этом случае вашим первым элементом будет функция, которая при вызове без аргументов дает #t.

0 голосов
/ 12 февраля 2011

Это работает (определите l1 '(#t #f #t))

(car l1)
; #t    
(and (car l1) (car (cdr l1)))
; #f

Но это не

(define l2 '((eq? 1 1) (eq? 1 2)))

(car l1)
; '(eq? 1 1)  
(and (car l1) (car (cdr l1)))
; fails

Что вы пытаетесь сделать?

Если второе, то подумайте над оценкой выражения, прежде чем вводить его в список, если это возможно.

Или вы можете попробовать:

(define l3 (list eq? 1 1))

l3
; '(#<procedure:eq?> 1 1)

(apply (car l3) (cdr l3))
; #t
...