From 54f683f0e0f937abd24aa6b052ff5a1dad319b4a Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Tue, 11 Dec 2007 17:41:48 -0500 Subject: [PATCH] Ported match.ss to ikarus. --- other-libs/interp-main.ss | 16 + other-libs/interp.ss | 21 + other-libs/match.ss | 855 ++++++++++++++++++++++++++++++++++++ other-libs/test-match.ss | 28 ++ scheme/ikarus.boot.prebuilt | Bin 4891850 -> 4897577 bytes scheme/ikarus.io.ss | 2 +- scheme/ikarus.trace.ss | 71 +-- scheme/last-revision | 2 +- scheme/makefile.ss | 2 + scheme/psyntax.expander.ss | 14 + 10 files changed, 975 insertions(+), 36 deletions(-) create mode 100644 other-libs/interp-main.ss create mode 100644 other-libs/interp.ss create mode 100644 other-libs/match.ss create mode 100755 other-libs/test-match.ss diff --git a/other-libs/interp-main.ss b/other-libs/interp-main.ss new file mode 100644 index 0000000..89a1851 --- /dev/null +++ b/other-libs/interp-main.ss @@ -0,0 +1,16 @@ + +(source "r6rs.ss") +(source "parameters.ss") +(source "match.ss") +(source "interp.ss") + +(library main + (export) + (import interp r6rs) + (write (ee '(let ((x 5)) + (let ((y (+ x x))) + (+ y x))))) + (newline)) + +(invoke main) +;(dump main "main.pp") diff --git a/other-libs/interp.ss b/other-libs/interp.ss new file mode 100644 index 0000000..2873f54 --- /dev/null +++ b/other-libs/interp.ss @@ -0,0 +1,21 @@ + + +(library interp + (export ee) + (import match r6rs) + (define (constant? x) + (or (number? x) (char? x) (string? x) (boolean? x))) + (define (ee x) + (define (ee x env) + (match x + (,c (guard (constant? c)) c) + (,x (guard (symbol? x)) + (cond + ((assq x env) => cdr) + (else (error 'ee "unbound ~s" x)))) + ((let ((,x ,v)) ,b) + (ee b (cons (cons x (ee v env)) env))) + ((+ ,(x) ,(y)) (+ x y)) + (,others (error 'ee "invalid expr ~s" others)))) + (ee x '()))) + diff --git a/other-libs/match.ss b/other-libs/match.ss new file mode 100644 index 0000000..041ac0c --- /dev/null +++ b/other-libs/match.ss @@ -0,0 +1,855 @@ +;;; match.ss + +;;; This program was originally designed and implemented by Dan +;;; Friedman. It was redesigned and implemented by Erik Hilsdale; +;;; some improvements were suggested by Steve Ganz. Additional +;;; modifications were made by Kent Dybvig. + +;; (Nov 2007) +;; Aziz Ghuloum added it to ikarus. + +;; (Apr 2007) +;; Aziz Ghuloum ported it to r6rs. + +;; (13 March 2002) +;; rkd added following change by Friedman and Ganz to the main source +;; code thread and fixed a couple of minor problems. + +;; (9 March 2002) +;; Dan Friedman and Steve Ganz added the ability to use identical pattern +;; variables. The patterns represented by the variables are compared +;; using the value of the parameter match-equality-test, which defaults +;; to equal?. +;; +;; > (match '(1 2 1 2 1) +;; ((,a ,b ,a ,b ,a) (guard (number? a) (number? b)) (+ a b))) +;; 3 +;; ;; +;; > (match '((1 2 3) 5 (1 2 3)) +;; (((,a ...) ,b (,a ...)) `(,a ... ,b))) +;; (1 2 3 5) +;; ;; +;; > (parameterize ((match-equality-test (lambda (x y) (equal? x (reverse y))))) +;; (match '((1 2 3) (3 2 1)) +;; ((,a ,a) 'yes) +;; (,oops 'no))) +;; yes + +;; (10 Jan 2002) +;; eh fixed bug that caused (match '((1 2 3 4)) (((,a ... ,d) . ,x) a)) to +;; blow up. The bug was caused by a bug in the sexp-dispatch procedure +;; where a base value empty list was passed to an accumulator from inside +;; the recursion, instead of passing the old value of the accumulator. + +;; (14 Jan 2001) +;; rkd added syntax checks to unquote pattern parsing to weed out invalid +;; patterns like ,#(a) and ,((vector-ref d 1)). + +;; (14 Jan 2001) +;; rkd added ,(Cata -> Id* ...) to allow specification of recursion +;; function. ,(Id* ...) recurs to match; ,(Cata -> Id* ...) recurs +;; to Cata. + +;; (14 Jan 2001) +;; rkd tightened up checks for ellipses and nested quasiquote; was comparing +;; symbolic names, which, as had been noted in the source, is a possible +;; hygiene bug. Replaced error call in guard-body with syntax-error to +;; allow error to include source line/character information. + +;; (13 Jan 2001) +;; rkd fixed match patterns of the form (stuff* ,(x) ... stuff+), which +;; had been recurring on subforms of each item rather than on the items +;; themselves. + +;; Previous changelog listings at end of file. + +;;; ============================================================ + +;; Exp ::= (match Exp Clause) +;; || (trace-match Exp Clause) +;; || (match+ (Id*) Exp Clause*) +;; || (trace-match+ (Id*) Exp Clause*) +;; || OtherSchemeExp + +;; Clause ::= (Pat Exp+) || (Pat (guard Exp*) Exp+) + +;; Pat ::= (Pat ... . Pat) +;; || (Pat . Pat) +;; || () +;; || #(Pat* Pat ... Pat*) +;; || #(Pat*) +;; || ,Id +;; || ,(Id*) +;; || ,(Cata -> Id*) +;; || Id + +;; Cata ::= Exp + +;; YOU'RE NOT ALLOWED TO REFER TO CATA VARS IN GUARDS. (reasonable!) + + + + +(library (match) + (export match trace-match guard ... quasiquote unquote + unquote-splicing) + (import (ikarus)) + +(define-syntax rec + (syntax-rules () + [(_ name val) + (letrec ([name val]) name)])) + +(define match-equality-test + (make-parameter + equal? + (lambda (x) + (unless (procedure? x) + (error 'match-equality-test "~s is not a procedure" x)) + x))) + +(define-syntax match+ + (lambda (x) + (syntax-case x () + ((ctxt (ThreadedId ...) Exp Clause ...) + #'(let f ((ThreadedId ThreadedId) ... (x Exp)) + (match-help ctxt f x (ThreadedId ...) Clause ...)))))) + +(define-syntax match + (lambda (x) + (syntax-case x () + ((ctxt Exp Clause ...) + #'(let f ((x Exp)) + (match-help ctxt f x () Clause ...)))))) + +(define-syntax trace-match+ + (lambda (x) + (syntax-case x () + ((ctxt (ThreadedId ...) Name Exp Clause ...) + #'(letrec ((f (trace-lambda Name (ThreadedId ... x) + (match-help ctxt f x (ThreadedId ...) Clause ...)))) + (f ThreadedId ... x)))))) + +(define-syntax trace-match + (lambda (x) + (syntax-case x () + ((ctxt Name Exp Clause ...) + #'(letrec ((f (trace-lambda Name (x) + (match-help ctxt f x () Clause ...)))) + (f Exp)))))) + +;;; ------------------------------ + +(define-syntax let-values** + (syntax-rules () + ((_ () B0 B ...) (begin B0 B ...)) + ((_ ((Formals Exp) Rest ...) B0 B ...) + (let-values** (Rest ...) + (call-with-values (lambda () Exp) + (lambda Formals B0 B ...)))))) + +(define-syntax match-help + (lambda (x) + (syntax-case x () + ((_ Template Cata Obj ThreadedIds) + #'(error 'match "Unmatched datum" Obj)) + ((_ Template Cata Obj ThreadedIds (Pat B0 B ...) Rest ...) + #'(convert-pat Pat + (match-help1 Template Cata Obj ThreadedIds + (B0 B ...) + Rest ...)))))) + +(define-syntax match-help1 + (lambda (x) + (syntax-case x (guard) + ((_ PatLit Vars () Cdecls Template Cata Obj ThreadedIds + ((guard) B0 B ...) Rest ...) + #'(let ((ls/false (sexp-dispatch Obj PatLit))) + (if ls/false + (apply (lambda Vars + (clause-body Cata Cdecls ThreadedIds + (extend-backquote Template B0 B ...))) + ls/false) + (match-help Template Cata Obj ThreadedIds Rest ...)))) + ((_ PatLit Vars (PG ...) Cdecls Template Cata Obj ThreadedIds + ((guard G ...) B0 B ...) Rest ...) + #'(let ((ls/false (sexp-dispatch Obj PatLit))) + (if (and ls/false (apply (lambda Vars + (guard-body Cdecls + (extend-backquote Template + (and PG ... G ...)))) + ls/false)) + (apply (lambda Vars + (clause-body Cata Cdecls ThreadedIds + (extend-backquote Template B0 B ...))) + ls/false) + (match-help Template Cata Obj ThreadedIds Rest ...)))) + ((_ PatLit Vars (PG ...) Cdecls Template Cata Obj ThreadedIds + (B0 B ...) Rest ...) + #'(match-help1 PatLit Vars (PG ...) Cdecls Template Cata Obj ThreadedIds + ((guard) B0 B ...) Rest ...))))) + +(define-syntax clause-body + (lambda (x) + (define build-mapper + (lambda (vars depth cata tIds) + (if (zero? depth) + cata + (with-syntax ((rest (build-mapper vars (- depth 1) cata tIds)) + (vars vars) + (tIds tIds)) + #'(mapper rest vars tIds))))) + (syntax-case x () + ((_ Cata ((CVar CDepth CMyCata CFormal ...) ...) (ThreadedId ...) B) + (with-syntax (((Mapper ...) + (map (lambda (mycata formals depth) + (build-mapper formals + (syntax->datum depth) + (syntax-case mycata () + (#f #'Cata) + (exp #'exp)) + #'(ThreadedId ...))) + #'(CMyCata ...) + #'((CFormal ...) ...) + #'(CDepth ...)))) + #'(let-values** (((ThreadedId ... CFormal ...) + (Mapper ThreadedId ... CVar)) + ...) + B)))))) + +(define-syntax guard-body + (lambda (x) + (syntax-case x () + ((_ ((Cvar Cdepth MyCata Cformal ...) ...) B) + (with-syntax (((CF ...) (apply append #'((Cformal ...) ...)))) + #'(let-syntax + ((CF + (lambda (x) + (syntax-case x () + (Name + (syntax-error #'Name + "guard cannot refer to return-value variable"))))) + ...) + B)))))) + +(define-syntax convert-pat + ;; returns sexp-pat x vars x guards x cdecls + (let () + (define ellipsis? + (lambda (x) + (and (identifier? x) (free-identifier=? x #'(... ...))))) + (define Var? + (lambda (x) + (syntax-case x (->) + (-> #f) + (id (identifier? #'id))))) + (define fVar + (lambda (var vars guards) + (let loop ((ls vars)) + (if (null? ls) + (values (cons var vars) guards) + (if (bound-identifier=? var (car ls)) + (with-syntax (((tmp) (generate-temporaries (list var))) + (var (car ls))) + (values (cons #'tmp vars) + (cons #'((match-equality-test) tmp var) guards))) + (loop (cdr ls))))))) + (define (f syn vars guards cdecls depth) + (define (andmap f ls) + (cond + ((null? ls) #f) + ((null? (cdr ls)) (f (car ls))) + (else (and (f (car ls)) (andmap f (cdr ls)))))) + (syntax-case syn (unquote) + ((unquote . stuff) ; separate for better error detection + (syntax-case syn (unquote ->) + ((unquote (MyCata -> Var ...)) + (andmap Var? #'(Var ...)) + (with-syntax (((Temp) (generate-temporaries '(x))) + (Depth depth)) + (values #'any + (cons #'Temp vars) + guards + (cons #'(Temp Depth MyCata Var ...) cdecls)))) + ((unquote (Var ...)) + (andmap Var? #'(Var ...)) + (with-syntax (((Temp) (generate-temporaries '(x))) + (Depth depth)) + (values #'any + (cons #'Temp vars) + guards + (cons #'(Temp Depth #f Var ...) cdecls)))) + ((unquote Var) + (Var? #'Var) + (let-values* (((vars guards) (fVar #'Var vars guards))) + (values #'any vars guards cdecls))))) + (((unquote . stuff) Dots) + (ellipsis? #'Dots) + (syntax-case syn (unquote ->) + (((unquote (MyCata -> Var ...)) Dots) + (andmap Var? #'(Var ...)) + (with-syntax (((Temp) (generate-temporaries '(x))) + (Depth+1 (add1 depth))) + (values #'each-any + (cons #'Temp vars) + guards + (cons #'(Temp Depth+1 MyCata Var ...) cdecls)))) + (((unquote (Var ...)) Dots) + (andmap Var? #'(Var ...)) + (with-syntax (((Temp) (generate-temporaries '(x))) + (Depth+1 (add1 depth))) + (values #'each-any + (cons #'Temp vars) + guards + (cons #'(Temp Depth+1 #f Var ...) cdecls)))) + (((unquote Var) Dots) + (Var? #'Var) + (let-values* (((vars guards) (fVar #'Var vars guards))) + (values #'each-any vars guards cdecls))) + ((expr Dots) (syntax-error #'expr "match-pattern unquote syntax")))) + ((Pat Dots) + (ellipsis? #'Dots) + (let-values* (((Dpat Dvars Dguards Dcdecls) + (f #'Pat vars guards cdecls (add1 depth)))) + (with-syntax ((Size (- (length Dvars) (length vars))) + (Dpat Dpat)) + (values #'#(each Dpat Size) Dvars Dguards Dcdecls)))) + ((Pat Dots . Rest) + (ellipsis? #'Dots) + (let-values* (((Rpat Rvars Rguards Rcdecls) + (f #'Rest vars guards cdecls depth)) + ((Dpat Dvars Dguards Dcdecls) + (f #'(Pat (... ...)) Rvars Rguards Rcdecls depth))) + (with-syntax ((Size (- (length Dvars) (length Rvars))) + ((RevRestTl . RevRest) (reverseX Rpat '())) + (Dpat Dpat)) + (values #'#(tail-each Dpat Size RevRest RevRestTl) + Dvars Dguards Dcdecls)))) + ((X . Y) + (let-values* (((Ypat Yvars Yguards Ycdecls) + (f #'Y vars guards cdecls depth)) + ((Xpat Xvars Xguards Xcdecls) + (f #'X Yvars Yguards Ycdecls depth))) + (with-syntax ((Xpat Xpat) (Ypat Ypat)) + (values #'(Xpat . Ypat) Xvars Xguards Xcdecls)))) + (() (values #'() vars guards cdecls)) + (#(X ...) + (let-values* (((Pat Vars Eqvars Cdecls) + (f #'(X ...) vars guards cdecls depth))) + (with-syntax ((Pat Pat)) + (values #'#(vector Pat) Vars Eqvars Cdecls)))) + (Thing (values #'#(atom Thing) vars guards cdecls)))) + (define reverseX + (lambda (ls acc) + (if (pair? ls) + (reverseX (cdr ls) (cons (car ls) acc)) + (cons ls acc)))) + (define-syntax let-values* + (syntax-rules () + ((_ () B0 B ...) (begin B0 B ...)) + ((_ (((Formal ...) Exp) Decl ...) B0 B ...) + (call-with-values (lambda () Exp) + (lambda (Formal ...) + (let-values* (Decl ...) B0 B ...)))))) + (define-syntax let-synvalues* + (syntax-rules () + ((_ () B0 B ...) (begin B0 B ...)) + ((_ (((Formal ...) Exp) Decl ...) B0 B ...) + (call-with-values (lambda () Exp) + (lambda (Formal ...) + (with-syntax ((Formal Formal) ...) + (let-synvalues* (Decl ...) B0 B ...))))))) + (lambda (syn) + (syntax-case syn () + ((_ syn (kh . kt)) + (let-synvalues* (((Pat Vars Guards Cdecls) (f #'syn '() '() '() 0))) + #'(kh 'Pat Vars Guards Cdecls . kt))))))) + +(define-syntax mapper + (lambda (x) + (syntax-case x () + ((_ F (RetId ...) (ThreadId ...)) + (with-syntax (((t ...) (generate-temporaries #'(RetId ...))) + ((ts ...) (generate-temporaries #'(RetId ...))) + ((null ...) (map (lambda (x) #''()) #'(RetId ...)))) + #'(let ((fun F)) + (rec g + (lambda (ThreadId ... ls) + (if (null? ls) + (values ThreadId ... null ...) + (call-with-values + (lambda () (g ThreadId ... (cdr ls))) + (lambda (ThreadId ... ts ...) + (call-with-values + (lambda () (fun ThreadId ... (car ls))) + (lambda (ThreadId ... t ...) + (values ThreadId ... (cons t ts) ...)))))))))))))) + +;;; ------------------------------ + +(define-syntax my-backquote + (lambda (x) + (define ellipsis? + (lambda (x) + (and (identifier? x) (free-identifier=? x #'(... ...))))) + (define-syntax with-values + (syntax-rules () + ((_ P C) (call-with-values (lambda () P) C)))) + (define-syntax syntax-lambda + (lambda (x) + (syntax-case x () + ((_ (Pat ...) Body0 Body ...) + (with-syntax (((X ...) (generate-temporaries #'(Pat ...)))) + #'(lambda (X ...) + (with-syntax ((Pat X) ...) + Body0 Body ...))))))) + (define-syntax with-temp + (syntax-rules () + ((_ V Body0 Body ...) + (with-syntax (((V) (generate-temporaries '(x)))) + Body0 Body ...)))) + (define-syntax with-temps + (syntax-rules () + ((_ (V ...) (Exp ...) Body0 Body ...) + (with-syntax (((V ...) (generate-temporaries #'(Exp ...)))) + Body0 Body ...)))) + (define destruct + (lambda (Orig x depth) + (syntax-case x (quasiquote unquote unquote-splicing) + ;; inner quasiquote + ((quasiquote Exp) + (with-values (destruct Orig #'Exp (add1 depth)) + (syntax-lambda (Builder Vars Exps) + (if (null? #'Vars) + (values #''(quasiquote Exp) '() '()) + (values #'(list 'quasiquote Builder) #'Vars #'Exps))))) + ;; unquote + ((unquote Exp) + (zero? depth) + (with-temp X + (values #'X (list #'X) (list #'Exp)))) + ((unquote Exp) + (with-values (destruct Orig #'Exp (sub1 depth)) + (syntax-lambda (Builder Vars Exps) + (if (null? #'Vars) + (values #''(unquote Exp) '() '()) + (values #'(list 'unquote Builder) #'Vars #'Exps))))) + ;; splicing + (((unquote-splicing Exp)) + (zero? depth) + (with-temp X + (values #'X (list #'X) (list #'Exp)))) + (((unquote-splicing Exp ...)) + (zero? depth) + (with-temps (X ...) (Exp ...) + (values #'(append X ...) #'(X ...) #'(Exp ...)))) + (((unquote-splicing Exp ...) . Rest) + (zero? depth) + (with-values (destruct Orig #'Rest depth) + (syntax-lambda (Builder Vars Exps) + (with-temps (X ...) (Exp ...) + (if (null? #'Vars) + (values #'(append X ... 'Rest) + #'(X ...) #'(Exp ...)) + (values #'(append X ... Builder) + #'(X ... . Vars) #'(Exp ... . Exps))))))) + ((unquote-splicing Exp ...) + (with-values (destruct Orig #'(Exp ...) (sub1 depth)) + (syntax-lambda (Builder Vars Exps) + (if (null? #'Vars) + (values #''(unquote-splicing Exp ...) '() '()) + (values #'(cons 'unquote-splicing Builder) + #'Vars #'Exps))))) + ;; dots + (((unquote Exp) Dots) + (and (zero? depth) (ellipsis? #'Dots)) + (with-temp X + (values #'X (list #'X) (list #'Exp)))) + (((unquote Exp) Dots . Rest) + (and (zero? depth) (ellipsis? #'Dots)) + (with-values (destruct Orig #'Rest depth) + (syntax-lambda (RestBuilder RestVars RestExps) + (with-syntax ((TailExp + (if (null? #'RestVars) + #''Rest + #'RestBuilder))) + (with-temp X + (values #'(append X TailExp) + (cons #'X #'RestVars) + (cons #'Exp #'RestExps))))))) + ((Exp Dots . Rest) + (and (zero? depth) (ellipsis? #'Dots)) + (with-values (destruct Orig #'Exp depth) + (syntax-lambda (ExpBuilder (ExpVar ...) (ExpExp ...)) + (if (null? #'(ExpVar ...)) + (syntax-error Orig "Bad ellipsis") + (with-values (destruct Orig #'Rest depth) + (syntax-lambda (RestBuilder RestVars RestExps) + (with-syntax ((TailExp + (if (null? #'RestVars) + #''Rest + #'RestBuilder)) + (Orig Orig)) + (values #'(let f ((ExpVar ExpVar) ...) + (if (and (pair? ExpVar) ...) + (cons + (let ((ExpVar (car ExpVar)) ...) + ExpBuilder) + (f (cdr ExpVar) ...)) + (if (and (null? ExpVar) ...) + TailExp + (error 'unquote + "Mismatched lists in ~s" + Orig)))) + (append #'(ExpVar ...) #'RestVars) + (append #'(ExpExp ...) #'RestExps))))))))) + ;; Vectors + (#(X ...) + (with-values (destruct Orig #'(X ...) depth) + (syntax-lambda (LsBuilder LsVars LsExps) + (values #'(list->vector LsBuilder) #'LsVars #'LsExps)))) + ;; random stuff + ((Hd . Tl) + (with-values (destruct Orig #'Hd depth) + (syntax-lambda (HdBuilder HdVars HdExps) + (with-values (destruct Orig #'Tl depth) + (syntax-lambda (TlBuilder TlVars TlExps) + (with-syntax ((Hd (if (null? #'HdVars) + #''Hd + #'HdBuilder)) + (Tl (if (null? #'TlVars) + #''Tl + #'TlBuilder))) + (values #'(cons Hd Tl) + (append #'HdVars #'TlVars) + (append #'HdExps #'TlExps)))))))) + (OtherThing + (values #''OtherThing '() '()))))) + ;; macro begins + (syntax-case x () + ((_ Datum) + (with-values (destruct #'(quasiquote Datum) #'Datum 0) + (syntax-lambda (Builder (Var ...) (Exp ...)) + (if (null? #'(Var ...)) + #''Datum + #'(let ((Var Exp) ...) + Builder)))))))) + +(define-syntax extend-backquote + (lambda (x) + (syntax-case x () + ((_ Template Exp ...) + (with-syntax ((quasiquote + (datum->syntax #'Template 'quasiquote))) + #'(let-syntax ((quasiquote + (lambda (x) + (syntax-case x () + ((_ Foo) #'(my-backquote Foo)))))) + Exp ...)))))) + +;;; ------------------------------ + +(define-syntax with-values + (syntax-rules () + ((_ P C) (call-with-values (lambda () P) C)))) + +(define-syntax letcc + (syntax-rules () + ((_ V B0 B ...) (call/cc (lambda (V) B0 B ...))))) + +(define classify-list + (lambda (ls) + (cond + ((null? ls) 'proper) + ((not (pair? ls)) 'improper) + (else + (let f ((tortoise ls) (hare (cdr ls))) + (cond + ((eq? tortoise hare) 'infinite) + ((null? hare) 'proper) + ((not (pair? hare)) 'improper) + (else + (let ((hare (cdr hare))) + (cond + ((null? hare) 'proper) + ((not (pair? hare)) 'improper) + (else (f (cdr ls) (cdr hare)))))))))))) + +(define ilist-copy-flat + (lambda (ils) + (let f ((tortoise ils) (hare (cdr ils))) + (if (eq? tortoise hare) + (list (car tortoise)) + (cons (car tortoise) (f (cdr tortoise) (cddr hare))))))) + +(define sexp-dispatch + (lambda (obj pat);; #f or list of vars + (letcc escape + (let ((fail (lambda () (escape #f)))) + (let f ((pat pat) (obj obj) (vals '())) + (cond + ((eq? pat 'any) + (cons obj vals)) + ((eq? pat 'each-any) + ;; handle infinities + (case (classify-list obj) + ((proper infinite) (cons obj vals)) + ((improper) (fail)))) + ((pair? pat) + (if (pair? obj) + (f (car pat) (car obj) (f (cdr pat) (cdr obj) vals)) + (fail))) + ((vector? pat) + (case (vector-ref pat 0) + ((atom) + (let ((a (vector-ref pat 1))) + (if (eqv? obj a) + vals + (fail)))) + ((vector) + (if (vector? obj) + (let ((vec-pat (vector-ref pat 1))) + (f vec-pat (vector->list obj) vals)) + (fail))) + ((each) + ;; if infinite, copy the list as flat, then do the matching, + ;; then do some set-cdrs. + (let ((each-pat (vector-ref pat 1)) + (each-size (vector-ref pat 2))) + (case (classify-list obj) + ((improper) (fail)) + ((infinite) + (let ((each-vals (f pat (ilist-copy-flat obj) '()))) + (for-each (lambda (x) (set-cdr! (last-pair x) x)) + each-vals) + (append each-vals vals))) + ((proper) + (append + (let g ((obj obj)) + (if (null? obj) + (make-list each-size '()) + (let ((hd-vals (f each-pat (car obj) '())) + (tl-vals (g (cdr obj)))) + (map cons hd-vals tl-vals)))) + vals))))) + ((tail-each) + (let ((each-pat (vector-ref pat 1)) + (each-size (vector-ref pat 2)) + (revtail-pat (vector-ref pat 3)) + (revtail-tail-pat (vector-ref pat 4))) + (when (eq? (classify-list obj) 'infinite) (fail)) + (with-values + (let g ((obj obj)) + ;; in-tail?, vals, revtail-left/ls + (cond + ((pair? obj) + (with-values (g (cdr obj)) + (lambda (in-tail? vals tail-left/ls) + (if in-tail? + (if (null? tail-left/ls) + (values #f vals (list (car obj))) + (values #t (f (car tail-left/ls) + (car obj) + vals) + (cdr tail-left/ls))) + (values #f vals + (cons (car obj) tail-left/ls)))))) + (else + (values #t + (f revtail-tail-pat obj vals) + revtail-pat)))) + (lambda (in-tail? vals tail-left/ls) + (if in-tail? + (if (null? tail-left/ls) + (append (make-list each-size '()) + vals) + (fail)) + (f each-pat tail-left/ls vals)))))))) + (else + (if (eqv? obj pat) + vals + (fail))))))))) +) + + +;;; examples of passing along threaded information. + +;;; Try (collect-symbols '(if (x y 'a 'c zz) 'b 'c)) +;;; Note that it commonizes the reference to c. + +;; (define-syntax with-values +;; (syntax-rules () +;; ((_ P C) (call-with-values (lambda () P) C)))) +;; (define collect-symbols +;; (lambda (exp) +;; (with-values (collect-symbols-help exp) +;; (lambda (symbol-decls exp) +;; (match symbol-decls +;; (((,symbol-name . ,symbol-var) ...) +;; `(let ((,symbol-var (quote ,symbol-name)) ...) ,exp))))))) +;; (define collect-symbols-help +;; (lambda (exp) +;; (let ((symbol-env '())) +;; (match+ (symbol-env) exp +;; (,x +;; (guard (symbol? x)) +;; (values symbol-env x)) +;; ((quote ,x) +;; (guard (symbol? x)) +;; (let ((pair/false (assq x symbol-env))) +;; (if pair/false +;; (values symbol-env (cdr pair/false)) +;; (let ((v (gensym))) +;; (values (cons (cons x v) symbol-env) +;; v))))) +;; ((quote ,x) +;; (values symbol-env `(quote ,x))) +;; ((if ,(t) ,(c) ,(a)) +;; (values symbol-env `(if ,t ,c ,a))) +;; ((,(op) ,(arg) ...) +;; (values symbol-env `(,op ,arg ...))))))) +;; +;; ;;; the grammar for this one is just if-exprs and everything else +;; +;; (define collect-leaves +;; (lambda (exp acc) +;; (match+ (acc) exp +;; ((if ,() ,() ,()) +;; acc) +;; ((,() ,() ...) +;; acc) +;; (,x +;; (cons x acc))))) +;; +;; ;; here's something that takes apart quoted stuff. +;; +;; (define destruct +;; (lambda (datum) +;; (match datum +;; (() `'()) +;; ((,(X) . ,(Y))`(cons ,X ,Y)) +;; (#(,(X) ...) `(vector ,X ...)) +;; (,thing +;; (guard (symbol? thing)) +;; `',thing) +;; (,thing +;; thing)))) +;; +;; ;; examples using explicit Catas +;; +;; (define sumsquares +;; (lambda (ls) +;; (define square +;; (lambda (x) +;; (* x x))) +;; (match ls +;; ((,(a*) ...) (apply + a*)) +;; (,(square -> n) n)))) +;; +;; (define sumsquares +;; (lambda (ls) +;; (define square +;; (lambda (x) +;; (* x x))) +;; (let ((acc 0)) +;; (match+ (acc) ls +;; ((,() ...) acc) +;; (,((lambda (acc x) (+ acc (square x))) ->) acc))))) +;; +;; ;;; The following uses explicit Catas to parse programs in the +;; ;;; simple language defined by the grammar below +;; +;; ;;; -> (program * ) +;; ;;; -> (if ) +;; ;;; | (set! ) +;; ;;; -> +;; ;;; | +;; ;;; | (if ) +;; ;;; | ( ) +;; +;; (define parse +;; (lambda (x) +;; (define Prog +;; (lambda (x) +;; (match x +;; ((program ,(Stmt -> s*) ... ,(Expr -> e)) +;; `(begin ,s* ... ,e)) +;; (,other (error 'parse "invalid program ~s" other))))) +;; (define Stmt +;; (lambda (x) +;; (match x +;; ((if ,(Expr -> e) ,(Stmt -> s1) ,(Stmt -> s2)) +;; `(if ,e ,s1 ,s2)) +;; ((set! ,v ,(Expr -> e)) +;; (guard (symbol? v)) +;; `(set! ,v ,e)) +;; (,other (error 'parse "invalid statement ~s" other))))) +;; (define Expr +;; (lambda (x) +;; (match x +;; (,v (guard (symbol? v)) v) +;; (,n (guard (integer? n)) n) +;; ((if ,(e1) ,(e2) ,(e3)) +;; `(if ,e1 ,e2 ,e3)) +;; ((,(rator) ,(rand*) ...) `(,rator ,rand* ...)) +;; (,other (error 'parse "invalid expression ~s" other))))) +;; (Prog x))) +;;; (parse '(program (set! x 3) (+ x 4)))) => (begin (set! x 3) (+ x 4)) + +;; CHANGELOG (most recent changes are logged at the top of this file) + +;; (29 Feb 2000) +;; Fixed a case sensitivity bug. + +;; (24 Feb 2000) +;; Matcher now handles vector patterns. Quasiquote also handles +;; vector patterns, but does NOT do the csv6.2 optimization of +;; `#(a 1 ,(+ 3 4) x y) ==> (vector 'a 1 (+ 3 4) 'x 'y). +;; Also fixed bug in (P ... . P) matching code. + +;; (23 Feb 2000) +;; KSM fixed bug in unquote-splicing inside quasiquote. + +;; (10 Feb 2000) +;; New forms match+ and trace-match+ thread arguments right-to-left. +;; The pattern (P ... . P) now works the way you might expect. +;; Infinite lists are now properly matched (and not matched). +;; Removed the @ pattern. +;; Internal: No longer converting into syntax-case. + +;; (6 Feb 2000) +;; Added expansion-time error message for referring to cata variable +;; in a guard. + +;; (4 Feb 2000) +;; Fixed backquote so it can handle nested backquote (oops). +;; Double-backquoted elipses are neutralized just as double-backquoted +;; unquotes are. So: +;; `(a ,'(1 2 3) ... b) =eval=> (a 1 2 3 b) +;; ``(a ,'(1 2 3) ... b) =eval=> `(a ,'(1 2 3) ... b) +;; ``(a ,(,(1 2 3) ...) b) =eval=> `(a ,(1 2 3) b) +;; Added support for +;; `((unquote-splicing x y z) b) =expand==> (append x y z (list 'b)) + +;; (1 Feb 2000) +;; Fixed a bug involving forgetting to quote stuff in the revised backquote. +;; Recognized unquote-splicing and signalled errors in the appropriate places. +;; Added support for deep elipses in backquote. +;; Rewrote backquote so it does the rebuilding directly instead of +;; expanding into Chez's backquote. + +;; (31 Jan 2000) +;; Kent Dybvig fixed template bug. + +;; (31 Jan 2000) +;; Added the trace-match form, and made guards contain +;; an explicit and expression: +;; (guard E ...) ==> (guard (and E ...)) + +;; (26 Jan 2000) +;; Inside the clauses of match expressions, the following +;; transformation is performed inside backquote expressions: +;; ,v ... ==> ,@v +;; (,v ,w) ... ==> ,@(map list v w) +;; etc. + diff --git a/other-libs/test-match.ss b/other-libs/test-match.ss new file mode 100755 index 0000000..b8dbaf2 --- /dev/null +++ b/other-libs/test-match.ss @@ -0,0 +1,28 @@ +#!/usr/bin/env scheme-script + +(import (ikarus) (match)) + +(define (constant? x) + (or (number? x) (char? x) (string? x) (boolean? x))) + +(define (ee x) + (define (ee x env) + (trace-match foo x + [,c (guard (constant? c)) c] + [,x (guard (symbol? x)) + (cond + ((assq x env) => cdr) + (else (error 'ee "unbound variable" x)))] + ;[(let ([,x* ,v*] ...) ,b) + ; (ee b (append (map cons x* (map (lambda (x) (ee x env)) v*)) env))] + [(let ([,x* ,[v*]] ...) ,b) + (ee b (append (map cons x* v*) env))] + [(+ ,[x] ,[y]) (+ x y)] + [,others (error 'ee "invalid expression" others)])) + (ee x '())) + +(pretty-print + (ee '(let ((x 5)) (let ((y (+ x x))) (+ y x))))) + +;(new-cafe ee) + diff --git a/scheme/ikarus.boot.prebuilt b/scheme/ikarus.boot.prebuilt index 576f900dc7be6a08ab72f2fd7c654cd19b747c04..f97700492cf187f7e5bd37965a6892706613136d 100644 GIT binary patch delta 1605201 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