Alex Vong <alexvong1...@gmail.com> writes: > Hi everyone, > > I am learning scheme, please bear with me if I am wrong. > > I try to define a new function LIST-OF-STRING? > > (define (list-of-string? lst) > (reduce and #f (map string? lst))) > > and I get the error > > While compiling expression: > ERROR: Syntax error: > unknown location: source expression failed to match any pattern in form > and > > It seems it is because AND is implemented as a macro, > so I try to implement my own RECURSIVE-AND > > (define (recursive-and . arg-lst) > (cond ((null? arg-lst) #t) > ((not (car arg-lst)) #f) > (else (apply recursive-and (cdr arg-lst))))) > > and now > > (define (list-of-string? lst) > (reduce recursive-and #f (map string? lst))) > > works as intended. > > Is it a leaking implementation detail that AND is implemented as a > macro?
No. It cannot be a function since it stops evaluation after the first false argument > Do we have a built-in procedural logical operators so that we don't > that error? >From (srfi srfi-1): (and ...) -> (every identity ... (or ...) -> (any identity ... (define (list-of-string? lst) (every string? lst)) Of course, this definition returns #t for '() while your definition returns #f for '(). I'd argue the former is more correct. But of course you can just write (define (list-of-string lst) (and (pair? lst) (every string? lst))) if you want the latter. -- David Kastrup