With scheme shrinking a bit, there's now space for these useful macros.
Signed-off-by: Keith Packard <keithp@keithp.com>
-(append '(a b c) '(d e f) '(g h i))
;
; Define a variable without returning the value
;
; Define a variable without returning the value
(macro (a . b)
; check for alternate lambda definition form
(macro (a . b)
; check for alternate lambda definition form
(set! b
(cons lambda (cons (cdr a) b)))
(set! a (car a))
(set! b
(cons lambda (cons (cdr a) b)))
(set! a (car a))
+ ; boolean operators
+
+(begin
+ (def! or
+ (macro a
+ (def! _or
+ (lambda (a)
+ (cond ((null? a) #f)
+ ((null? (cdr a))
+ (car a))
+ (else
+ (list
+ cond
+ (list
+ (car a))
+ (list
+ 'else
+ (_or (cdr a))
+ )
+ )
+ )
+ )
+ )
+ )
+ (_or a)))
+ 'or)
+
+ ; execute to resolve macros
+
+(or #f #t)
+
+(begin
+ (def! and
+ (macro a
+ (def! _and
+ (lambda (a)
+ (cond ((null? a) #t)
+ ((null? (cdr a))
+ (car a))
+ (else
+ (list
+ cond
+ (list
+ (car a)
+ (_and (cdr a))
+ )
+ )
+ )
+ )
+ )
+ )
+ (_and a)
+ )
+ )
+ 'and)
+
+ ; execute to resolve macros
+
+(and #t #f)
+
-(define (caar l) (car (car l)))
+(define (caar a) (car (car a)))
-(define (cadr l) (car (cdr l)))
+(define (cadr a) (car (cdr a)))
-(define (cdar l) (cdr (car l)))
+; (define (cdar a) (cdr (car a)))
; (if <condition> <if-true>)
; (if <condition> <if-true> <if-false)
(define if
; (if <condition> <if-true>)
; (if <condition> <if-true> <if-false)
(define if
- (macro (test . args)
- (cond ((null? (cdr args))
- (list cond (list test (car args)))
+ (macro (test . b)
+ (cond ((null? (cdr b))
+ (list cond (list test (car b)))
- (list test (car args))
- (list 'else (cadr args))
+ (list test (car b))
+ (list 'else (cadr b))
(equal? '(a b c) '(a b c))
(equal? '(a b c) '(a b b))
(equal? '(a b c) '(a b c))
(equal? '(a b c) '(a b b))
-(define member (lambda (obj a . test?)
- (cond ((null? a)
- #f
- )
- (else
- (if (null? test?) (set! test? equal?) (set! test? (car test?)))
- (if (test? obj (car a))
- a
- (member obj (cdr a) test?))
- )
- )
- )
+(define (member a b . t?)
+ (cond ((null? b)
+ #f
+ )
+ (else
+ (if (null? t?) (set! t? equal?) (set! t? (car t?)))
+ (if (t? a (car b))
+ b
+ (member a (cdr b) t?))
+ )
+ )
)
(member '(2) '((1) (2) (3)))
(member '(4) '((1) (2) (3)))
)
(member '(2) '((1) (2) (3)))
(member '(4) '((1) (2) (3)))
-(define (memq obj a) (member obj a eq?))
+(define (memq a b) (member a b eq?))
(memq '(2) '((1) (2) (3)))
(memq '(2) '((1) (2) (3)))
(if (null? b)
#f
(if (t? a (caar b))
(car b)
(if (null? b)
#f
(if (t? a (caar b))
(car b)
-(define (assq a b) (_assoc a b eq?))
-(define (assoc a b) (_assoc a b equal?))
+(define (assq a b) (_as a b eq?))
+(define (assoc a b) (_as a b equal?))
(assq 'a '((a 1) (b 2) (c 3)))
(assoc '(c) '((a 1) (b 2) ((c) 3)))
(assq 'a '((a 1) (b 2) (c 3)))
(assoc '(c) '((a 1) (b 2) ((c) 3)))
(define map
(lambda (a . b)
(define map
(lambda (a . b)
(cond ((null? b) ())
(else
(cond ((null? b) ())
(else
- (cons (caar b) (args (cdr b)))
+ (cons (caar b) (_a (cdr b)))
(cond ((null? b) ())
(else
(cond ((null? b) ())
(else
- (cons (cdr (car b)) (next (cdr b)))
+ (cons (cdr (car b)) (_n (cdr b)))
(cond ((null? (car b)) ())
(else
(cond ((null? (car b)) ())
(else
- (cons (apply a (args b)) (domap (next b)))
+ (cons (apply a (_a b)) (_d (_n b)))