ref: 7e65db3e745be35cd3622de1ef49f1ee7a278318
parent: bbcc68cfdf84fd2bd2f804f555c64d808a1c54d5
author: JeffBezanson <jeff.bezanson@gmail.com>
date: Sat May 30 17:13:13 EDT 2009
faster append removing 'equal' alias removing some top level bindings
--- a/femtolisp/ast/match.lsp
+++ b/femtolisp/ast/match.lsp
@@ -44,7 +44,7 @@
(#t
(let ((capt (assq p state)))
(if capt
- (and (equal expr (cdr capt)) state)
+ (and (equal? expr (cdr capt)) state)
(cons (cons p expr) state))))))
((procedure? p)
@@ -51,8 +51,8 @@
(and (p expr) state))
((pair? p)
- (cond ((eq (car p) '-/) (and (equal (cadr p) expr) state))
- ((eq (car p) '-^) (and (not (match- (cadr p) expr state)) state))
+ (cond ((eq (car p) '-/) (and (equal? (cadr p) expr) state))
+ ((eq (car p) '-^) (and (not (match- (cadr p) expr state)) state))
((eq (car p) '--)
(and (match- (caddr p) expr state)
(cons (cons (cadr p) expr) state)))
@@ -60,11 +60,11 @@
(match-alt (cdr p) () (list expr) state #f 1))
(#t
(and (pair? expr)
- (equal (car p) (car expr))
+ (equal? (car p) (car expr))
(match-seq (cdr p) (cdr expr) state (length (cdr expr)))))))
(#t
- (and (equal p expr) state))))
+ (and (equal? p expr) state))))
; match an alternation
(define (match-alt alt prest expr state var L)
--- a/femtolisp/cps.lsp
+++ b/femtolisp/cps.lsp
@@ -176,7 +176,7 @@
(let ((body (caddr form))
(args (cadr form)))
(and (pair? body)
- (equal (cdr body) args)
+ (equal? (cdr body) args)
(constant? (car (caddr form))))))
(car (caddr form)))
(#t (map η-reduce form))))
@@ -269,7 +269,7 @@
lo))
; example from Chung-chieh Shan's paper
-(assert (equal
+(assert (equal?
(with-delimited-continuations
(cons 'a (reset (cons 'b (shift f (cons 1 (f (f (cons 'c ())))))))))
'(a 1 b b c)))
--- a/femtolisp/flisp.boot
+++ b/femtolisp/flisp.boot
@@ -116,12 +116,10 @@
#function("n2c0e130q42;" [#function("r`e0e1g013131c2ms;" [1- length #function("n1e0g00g11f0[g10f0u43;" [put!])]) table])
make-code-emitter
#function("n0_e030`Z3;" [table])
-macroexpand-in
-#function("n2f0?6;0f0;c0e1f0Mf132q42;" [#function("rf06M0e0e1f031g00NQ2e2f03142;c3e4g0031q42;" [macroexpand-in cadr caddr #function("rf06F0e0f0g10NQ2g1142;g10Mc1<6T0g10;g10Mc2<6\x920c3e4g1031F6\x8d0e5g1031F6\x830c6e4g1031K5\x8a0e7g10315\x8e0^q42;g10Mc8<6\xc10c9e:g1031e;c2L1_L1e<e4g10313133L1q43;e=c>mg1042;" [macroexpand-in quote lambda #function("rc0e1f031e2f0g2132q43;" [#function("re0c1e2g3031f0A6G0f15Y0c1f0f1L3e3c4mf032Ke5g303144;" [nlist* lambda cadr map #function("n1^;" []) cdddr]) get-defined-vars macroexpand-in]) cddr cdddr begin caddr let-syntax #function("re0f1e1e2c3mf032g213242;" [macroexpand-in nconc map #function("n1f0Me0e1f031g3132g31L3;" [macroexpand-in cadr])]) cadr nconc copy-list map #function("n1e0f0g2142;" [macroexpand-in])]) macrocall?]) assq])
macroexpand-1
#function("n1f0?6;0f0;c0e1f031q42;" [#function("rf06?0f0g00Nt2;g00;" []) macrocall?])
macroexpand
-#function("n1e0f0_42;" [macroexpand-in])
+#function("n1c0^^q43;" [#function("rc0mj02c1mj12f1g00_42;" [#function("n2c0e1f031F6]0e2f031F6T0c3e1f031K5Z0e4f0315^0^q42;" [#function("rc0e1f031g11f0g0132q43;" [#function("re0c1e2g1031f0A6G0f15Y0c1f0f1L3e3c4mf032Ke5g103144;" [nlist* lambda cadr map #function("n1^;" []) lastcdr]) get-defined-vars]) cddr cdddr begin caddr]) #function("n2f0?6;0f0;c0e1f0Mf132q42;" [#function("rf06N0g11e0f031g00NQ2e1f03142;c2e3g0031q42;" [cadr caddr #function("rf06G0g21f0g10NQ2g1142;g10Mc0<6U0g10;g10Mc1<6k0g20g10g1142;g10Mc2<6\x9a0c3e4g1031e5c1L1_L1e6e7g10313133L1q43;e8c9mg1042;" [quote lambda let-syntax #function("rg31f1e0e1c2mf032g213242;" [nconc map #function("n1f0Mg41e0f031g3132g31L3;" [cadr])]) cadr nconc copy-list cddr map #function("n1g31f0g2142;" [])]) macrocall?]) assq])])])
macrocall?
#function("n1f0MC16E02e0e1f0M^43;" [get *syntax-environment*])
lookup-sym
@@ -286,10 +284,8 @@
#function("n2e0e1c2f0c3f1f1aW6J0c45L0c53541;" [error string "compile error: " " expects " " argument." " arguments."])
arg-counts
#table(:not 1 :set-cdr! 2 :cons 2 :number? 1 :equal? 2 :cdr 1 :vector? 1 :eqv? 2 := 2 :div0 2 :atom? 1 :aref 2 :compare 2 :< 2 :null? 1 :eq? 2 :car 1 :set-car! 2 :builtin? 1 :aset! 3 :bound? 1 :boolean? 1 :pair? 1 :symbol? 1 :fixnum? 1)
-append2
-#function("n2f0A6;0f1;f0Me0f0Nf132K;" [append2])
append
-#function("o0f0A6:0_;f0NA6E0f0M;e0f0Me1f0NQ242;" [append2 append])
+#function("o0f0A6:0_;f0NA6E0f0M;e0e1f0M31e2f0NQ242;" [nconc copy-list append])
any
#function("n2f1F16O02f0f1M3117O02e0f0f1N42;" [any])
abs
--- a/femtolisp/flisp.c
+++ b/femtolisp/flisp.c
@@ -1566,7 +1566,6 @@
setc(symbol(builtin_names[i]), builtin(i));
}
setc(symbol("eq"), builtin(OP_EQ));
- setc(symbol("equal"), builtin(OP_EQUAL));
setc(symbol("procedure?"), builtin(OP_FUNCTIONP));
#ifdef LINUX
--- a/femtolisp/perf.lsp
+++ b/femtolisp/perf.lsp
@@ -4,9 +4,9 @@
(load "tcolor.lsp")
(princ "fib(34): ")
-(assert (equal (time (fib 34)) 5702887))
+(assert (equal? (time (fib 34)) 5702887))
(princ "yfib(32): ")
-(assert (equal (time (yfib 32)) 2178309))
+(assert (equal? (time (yfib 32)) 2178309))
(princ "sort: ")
(set! r (map-int (lambda (x) (mod (+ (* x 9421) 12345) 1024)) 1000))
@@ -24,5 +24,5 @@
(load "rpasses.lsp")
(define *input* (load "datetimeR.lsp"))
(time (set! *output* (compile-ish *input*)))
-(assert (equal *output* (load "rpasses-out.lsp")))
+(assert (equal? *output* (load "rpasses-out.lsp")))
(path.cwd "..")
--- a/femtolisp/system.lsp
+++ b/femtolisp/system.lsp
@@ -74,16 +74,11 @@
; standard procedures ---------------------------------------------------------
-(define (append2 l d)
- (if (null? l) d
- (cons (car l)
- (append2 (cdr l) d))))
-
(define (append . lsts)
(cond ((null? lsts) ())
((null? (cdr lsts)) (car lsts))
- (#t (append2 (car lsts)
- (apply append (cdr lsts))))))
+ (#t (nconc (copy-list (car lsts))
+ (apply append (cdr lsts))))))
(define (member item lst)
(cond ((atom? lst) #f)
@@ -249,11 +244,6 @@
(define (reverse lst) (foldl cons () lst))
-(define (copy-tree l)
- (if (atom? l) l
- (cons (copy-tree (car l))
- (copy-tree (cdr l)))))
-
(define (nreverse l)
(let ((prev ()))
(while (pair? l)
@@ -262,6 +252,11 @@
(set! prev l))))))
prev))
+(define (copy-tree l)
+ (if (atom? l) l
+ (cons (copy-tree (car l))
+ (copy-tree (cdr l)))))
+
(define (delete-duplicates lst)
(if (atom? lst)
lst
@@ -609,46 +604,47 @@
(if f (apply f (cdr e))
e))))
-(define (macroexpand e) (macroexpand-in e ()))
-
-(define (macroexpand-in e env)
- (if (atom? e) e
- (let ((f (assq (car e) env)))
- (if f
- (macroexpand-in (apply (cadr f) (cdr e)) (caddr f))
- (let ((f (macrocall? e)))
- (if f
- (macroexpand-in (apply f (cdr e)) env)
- (cond ((eq (car e) 'quote) e)
- ((eq (car e) 'lambda)
- (let ((B (if (pair? (cddr e))
- (if (pair? (cdddr e))
- (cons 'begin (cddr e))
- (caddr e))
- #f)))
- (let ((V (get-defined-vars B))
- (Be (macroexpand-in B env)))
- (nlist* 'lambda
- (cadr e)
- (if (null? V)
- Be
- (cons (list 'lambda V Be)
- (map (lambda (x) #f) V)))
- (cdddr e)))))
- ((eq (car e) 'let-syntax)
- (let ((binds (cadr e))
- (body `((lambda () ,@(cddr e)))))
- (macroexpand-in
- body
- (nconc
- (map (lambda (bind)
- (list (car bind)
- (macroexpand-in (cadr bind) env)
- env))
- binds)
- env))))
- (else
- (map (lambda (x) (macroexpand-in x env)) e)))))))))
+(define (macroexpand e)
+ (define (expand-lambda e env)
+ (let ((B (if (pair? (cddr e))
+ (if (pair? (cdddr e))
+ (cons 'begin (cddr e))
+ (caddr e))
+ #f)))
+ (let ((V (get-defined-vars B))
+ (Be (macroexpand-in B env)))
+ (nlist* 'lambda
+ (cadr e)
+ (if (null? V)
+ Be
+ (cons (list 'lambda V Be)
+ (map (lambda (x) #f) V)))
+ (lastcdr e)))))
+ (define (macroexpand-in e env)
+ (if (atom? e) e
+ (let ((f (assq (car e) env)))
+ (if f
+ (macroexpand-in (apply (cadr f) (cdr e)) (caddr f))
+ (let ((f (macrocall? e)))
+ (if f
+ (macroexpand-in (apply f (cdr e)) env)
+ (cond ((eq (car e) 'quote) e)
+ ((eq (car e) 'lambda) (expand-lambda e env))
+ ((eq (car e) 'let-syntax)
+ (let ((binds (cadr e))
+ (body `((lambda () ,@(cddr e)))))
+ (macroexpand-in
+ body
+ (nconc
+ (map (lambda (bind)
+ (list (car bind)
+ (macroexpand-in (cadr bind) env)
+ env))
+ binds)
+ env))))
+ (else
+ (map (lambda (x) (macroexpand-in x env)) e)))))))))
+ (macroexpand-in e ()))
(define (expand x) (macroexpand x))
--- a/femtolisp/tcolor.lsp
+++ b/femtolisp/tcolor.lsp
@@ -9,7 +9,8 @@
(set! C (color-pairs Q '(a b c d e)))
(dotimes (n 99) (color-pairs Q '(a b c d e))))
(time (ct))
-(assert (equal C '((23 . a) (9 . a) (22 . b) (17 . d) (14 . d) (8 . b) (21 . e)
- (19 . b) (16 . c) (13 . c) (11 . b) (7 . e) (24 . c) (20 . d)
- (18 . e) (15 . a) (12 . a) (10 . e) (6 . d) (5 . c) (4 . e)
- (3 . d) (2 . c) (0 . b) (1 . a))))
+(assert (equal? C
+ '((23 . a) (9 . a) (22 . b) (17 . d) (14 . d) (8 . b) (21 . e)
+ (19 . b) (16 . c) (13 . c) (11 . b) (7 . e) (24 . c) (20 . d)
+ (18 . e) (15 . a) (12 . a) (10 . e) (6 . d) (5 . c) (4 . e)
+ (3 . d) (2 . c) (0 . b) (1 . a))))
--- a/femtolisp/unittest.lsp
+++ b/femtolisp/unittest.lsp
@@ -58,15 +58,15 @@
(assert (< (- #uint64(0x8000000000000000)) 0))
(assert (> (- #int64(0x8000000000000000)) 0))
-(assert (not (equal #int64(0x8000000000000000) #uint64(0x8000000000000000))))
-(assert (equal (+ #int64(0x4000000000000000) #int64(0x4000000000000000))
- #uint64(0x8000000000000000)))
-(assert (equal (* 2 #int64(0x4000000000000000))
- #uint64(0x8000000000000000)))
+(assert (not (equal? #int64(0x8000000000000000) #uint64(0x8000000000000000))))
+(assert (equal? (+ #int64(0x4000000000000000) #int64(0x4000000000000000))
+ #uint64(0x8000000000000000)))
+(assert (equal? (* 2 #int64(0x4000000000000000))
+ #uint64(0x8000000000000000)))
-(assert (equal (uint64 (double -123)) #uint64(0xffffffffffffff85)))
+(assert (equal? (uint64 (double -123)) #uint64(0xffffffffffffff85)))
-(assert (equal (string 'sym #byte(65) #wchar(945) "blah") "symA\u03B1blah"))
+(assert (equal? (string 'sym #byte(65) #wchar(945) "blah") "symA\u03B1blah"))
; NaNs
(assert (equal? +nan.0 +nan.0))
@@ -100,14 +100,14 @@
; ok, a couple end-to-end tests as well
(define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))
-(assert (equal (fib 20) 6765))
+(assert (equal? (fib 20) 6765))
(load "color.lsp")
-(assert (equal (color-pairs (generate-5x5-pairs) '(a b c d e))
- '((23 . a) (9 . a) (22 . b) (17 . d) (14 . d) (8 . b) (21 . e)
- (19 . b) (16 . c) (13 . c) (11 . b) (7 . e) (24 . c) (20 . d)
- (18 . e) (15 . a) (12 . a) (10 . e) (6 . d) (5 . c) (4 . e)
- (3 . d) (2 . c) (0 . b) (1 . a))))
+(assert (equal? (color-pairs (generate-5x5-pairs) '(a b c d e))
+ '((23 . a) (9 . a) (22 . b) (17 . d) (14 . d) (8 . b) (21 . e)
+ (19 . b) (16 . c) (13 . c) (11 . b) (7 . e) (24 . c) (20 . d)
+ (18 . e) (15 . a) (12 . a) (10 . e) (6 . d) (5 . c) (4 . e)
+ (3 . d) (2 . c) (0 . b) (1 . a))))
; hashing strange things
(assert (equal?