On Tue, 22 Jun 2010 12:22:52 +0200
Mate Nagy <mn...@port70.net> wrote:

> On Tue, Jun 22, 2010 at 03:10:27AM -0700, Robert Ransom wrote:
> > Scheme *should* be used for everything because at least one good macro
> > system has been designed for it.  Lisp macros can do arbitrary
> > computation at compile-time, and the Scheme macro system required by
> > R6RS provides all the power of Lisp macros *and* supports a
> > pattern-matching macro specification syntax for simple syntactic sugar.
>  this is exactly the reason scheme macros are horrible and Lisp macros
> are better for your mind and health. This is one of the humongous,
> indefensible warts on the scheme language (the other being #f)

To get rid of #F in IF:

(define-syntax if
  (syntax-rules ()
    ((if test true-exp false-exp)
     (sys:if (eq? test '()) true-exp false-exp))
    ((if test true-exp)
     (sys:if (eq? test '()) true-exp))))

To de-#F predicates:

(define-syntax sys-name
  (lambda (exp)
    (datum->syntax
     exp
     (string->symbol
      (string-append
       "sys:"
       (symbol->string
        (syntax->datum exp)))))))

(define-syntax de-false-semi-predicate
  (syntax-rules ()
    ((de-false-semi-predicate pred-name)
     (define (pred-name . args)
       (sys:or (apply (sys-name pred-name) args) '())))))

(define-syntax de-false-predicate
  (syntax-rules ()
    ((de-false-predicate pred-name)
     (define (pred-name . args)
       (sys:if (apply (sys-name pred-name) args)
               't
               '())))))

Zapping #F elsewhere is another SMOP, much easier than implementing the
sufficiently smart compiler.  In any non-Lisp language, this would also
require hacking on the compiler.

Robert Ransom

Attachment: signature.asc
Description: PGP signature

Reply via email to