seb1525@mvs.draper.com ("Stephen E. Bacher") (03/11/91)
Dunno why my original posting didn't appear in the newsgroup, so here goes one more time: > >>>As for the reason why special forms cannot be FUNCALLed or APPLYe, I reckon >>>it has to do with the fact that it is unknown which (if any) args are to >>>be evaluated or not. >>> >>>If SOME or EVERY won't do the job, you could use >>> (eval (cons 'or list-of-values)).... >> >>NO WAY. E.g.: >> >> (setq list-of-values '(a b c d e)) >> (apply #'or list-of-values) >> >> ...pretending for a minute that the above works somehow... >> >> ==> (apply #'or '(a b c d e)) >> >> But... >> >> (eval (cons 'or list-of-values)) >> >> ==> (eval (cons 'or '(a b c d e))) >> ==> (eval '(or a b c d e)) >> ==> *ERROR* ; if you're lucky >> >> What would work is >> >> (eval (cons 'or (mapcar #'(lambda (x) (list 'quote x)) list-of-values)) >> Now you say: >However he missed my second mistake and introduces one of his own >in my original note I wrote : ...[stuff that called OR and AND special forms instead of macros]... >However the criticism that my use of EVAL doesn't work is invalid. >EVAL is a function, and thus evaluates the argument. So >> >> ==> (eval (cons 'or '(a b c d e))) >> ==> (eval '(or a b c d e)) >> ==> *ERROR* ; if you're lucky >is wrong. Is it? Did you try the above out on *your* Lisp interpreter? Yes, EVAL evaluates its argument, so... (eval '(or a b c d e)) ; where list-of-values is '(a b c d e) gets an evaluated (QUOTE (OR A B C D E )), which is the list (OR A B C D E). When this is evaluated, execution of the OR macro (or special form, depending on your implementation) needs to evaluate the form A to see if it's NIL or not. (The effect would be the same if OR were a function: A would have to get evaluated.) So if your intent was for A,B,C,D,E to be values (as I assumed from your use of the name "list-of-values", as well as the general context of the problem), you would lose. That's why you have to quotify each element in the list. - SEB