Я также сталкиваюсь с этой проблемой, играя с PLT-схемой 372, я углубился в поведение и-синтаксиса и выясняю следующий код, который работает так же, как если бы можно было интуитивно ожидать, что (apply and lst)
вернется, но я не провел исчерпывающий тест.
(define (list-and lst)
(cond
((null? lst) '())
((not (pair? lst)) (and lst))
((eq? (length lst) 1) (car lst))
(else
(and (car lst)
(list-and (cdr lst))))
)
)
Welcome to DrScheme, version 372 [3m].
Language: Textual (MzScheme, includes R5RS).
> (eq? (and '()) (list-and '()))
#t
> (eq? (and '#f) (list-and (list '#f)))
#t
> (eq? (and 'a) (list-and (list 'a)))
#t
> (eq? (and 'a 'b) (list-and (list 'a 'b)))
#t
> (eq? (and 'a 'b '()) (list-and (list 'a 'b '())))
#t
> (eq? (and 'a 'b '#t) (list-and (list 'a 'b '#t)))
#t
> (eq? (and 'a 'b '#f) (list-and (list 'a 'b '#f)))
#t
Я также нашел другой способ захвата ума обходной путь. Я называю это захватом ума , потому что сначала я не знаю, как превратить его в функцию ... Вот оно (только демонстрация моей интуитивной идеи):
Welcome to DrScheme, version 372 [3m].
Language: Textual (MzScheme, includes R5RS).
> (eval (cons 'and (list ''#f ''#f ''#t)))
#f
> (eval (cons 'and (list ''a ''b ''c)))
c
Но позже я задал вопрос и получил ответ здесь: Можно ли сгенерировать (quote (quote var)) или '' var динамически? . С помощью этого ответа можно легко превратить вышеуказанную идею в функцию.
(define (my-quote lst)
(map (lambda (x) `'',x) lst))
(cons 'and (my-quote (list 'a 'b 'c)))
=> '(and ''a ''b ''c)