Gauche:matchcomp
matchcompのパッチ
matchcomp.tar.gzのmatchcomp.scmをGaucheで動かすパッチです。モジュールにしたかったのですが、cut,extendが被っていたのでパッチにしました。--hira
- 関連ページ
- Shiro: ありゃ。今、Andrew Wrightのmatchを移植してるところです。 どうしようかなあ。matchcompはライセンスに「無償」が入っちゃってるんで、 Gauche本体に入れるのは微妙です。別パッケージならいいけど。
- hira: 確かに「無償」はイヤですね。それにしてもmatchの移植とはヘビーなことやってますね。今日の私はRubyのDir.globが作りたくて、それでパターン周りをごそごそやっていたのでした。まず最初にmatchの移植を試みたのですが一瞬で挫折したと。matchcompはすぐに移植できたけど、使い方がよく分からず。patmatはProlog?な感じがして・・・結局自作かなぁと思っていたところです。mitのYentaのslib移植版matchはご覧になりましたか?これが使えるかもと思って眺めていたのですが、とんでもないインデントでS式が宙に浮いているのが笑えます。
- Shiro: matchはもともとmatchマクロを使って書かれているんで、 bootstrapのために、一度展開したソースが必要になります。 そのソースをprettyprintしたらああなっちゃったんでしょう。
--- matchcomp.scm.org 2004-04-12 19:06:18.898875000 +0900
+++ matchcomp.scm 2004-04-12 19:07:51.930125000 +0900
@@ -58,6 +58,14 @@
;;;===========================================================1
;;; The pattern compiler
+(define-syntax defmacro
+ (syntax-rules ()
+ ((_ name clause expr ...) (define-macro name (lambda clause expr ...)))))
+
+(define t #t)
+
+(define (atom? obj) (not (pair? obj)))
+
(define (compile-match-meaning f)
(case (car f)
((*sexp) (compile-match-sexp-meaning))
@@ -120,7 +128,7 @@
e r a m (lambda (ee rr)
(if (eq? (lookup rr n) unbound-pattern)
`(let ((,n ,e))
- ,(k e (extend rr n n)) )
+ ,(k e (extends rr n n)) )
(match-wrong "Cannot rebind pattern" n) ) ) ) ) )
(define (compile-match-eval-meaning n)
@@ -128,7 +136,7 @@
(let ((form (lookup r n)))
(if (eq? form unbound-pattern)
(match-wrong "Unbound pattern" n)
- (if (pair? form) ;; here form = (cut head tail promise)
+ (if (pair? form) ;; here form = (kut head tail promise)
`(segment-check ,e ,(cadr form) ,(caddr form)
,(let ((g (gensym)))
`(lambda (,g)
@@ -138,14 +146,14 @@
(define (compile-match-ssetq-append-meaning n f1 f2)
(lambda (e r a m k)
((compile-match-meaning f1)
- e r (extend a.init n
+ e r (extends a.init n
(lambda (ee rr)
(if (eq? (lookup rr n) unbound-pattern)
(let ((g (gensym)))
- `(letrec ((,g (delay (set! ,n (cut ,e ,ee))))
+ `(letrec ((,g (delay (set! ,n (kut ,e ,ee))))
(,n 'wait) )
,((compile-match-meaning f2)
- ee (extend rr n `(cut ,e ,ee ,g)) a m k ) ) )
+ ee (extends rr n `(kut ,e ,ee ,g)) a m k ) ) )
(match-wrong "cannot rebind pattern" n) ) ) )
m.init (lambda (ee rr)
(match-wrong "*ssetq-append not ended" f1) ) ) ) )
@@ -156,7 +164,7 @@
(if (eq? (lookup r n) unbound-pattern)
(match-wrong "Unbound segment" n)
(let ((g (gensym)))
- (if (pair? form) ;; here form = (cut head tail promise)
+ (if (pair? form) ;; here form = (kut head tail promise)
`(segment-check ,e ,(cadr form) ,(caddr form)
(lambda (,g)
,((compile-match-meaning f)
@@ -180,7 +188,7 @@
g r a m k )
,((compile-match-meaning f1)
g r a.init
- (extend m.init n
+ (extends m.init n
(lambda (ee rr)
(if (eq? rr r)
`(,try ,ee)
@@ -218,7 +226,7 @@
(define unbound-pattern (gensym))
-(define (extend fn pt im)
+(define (extends fn pt im)
(cons (cons pt im) fn) )
(define (lookup r n)
@@ -232,7 +240,7 @@
(define (force-all-segments r)
(if (pair? r)
(let ((form (cdar r)))
- (if (pair? form) ;; here form = (cut head tail promise)
+ (if (pair? form) ;; here form = (kut head tail promise)
(cons `(force ,(cadddr form))
(force-all-segments (cdr r)) )
(force-all-segments (cdr r)) ) )
@@ -259,9 +267,9 @@
#f )
#f ) ) )
-(define (cut e ee)
+(define (kut e ee)
(if (eq? e ee) '()
- (cons (car e) (cut (cdr e) ee)) ) )
+ (cons (car e) (kut (cdr e) ee)) ) )
;;;===========================================================3
;;; The matching macros. Match failure return #f as is usual in Lisp.
@@ -327,7 +335,7 @@
(defmacro defmacro-pattern (name variables . body)
`(begin
(set! r.macro-pattern
- (extend r.macro-pattern
+ (extends r.macro-pattern
',name
(lambda ,variables . ,body) ) )
',name ) )
@@ -456,7 +464,7 @@
(let ((name (term-variable-true-name e)))
(if (eq? (lookup r name) unbound-pattern)
(c `(*setq ,name (*sexp))
- (extend r name 'term) )
+ (extends r name 'term) )
(c `(*eval ,name) r) ) ) ) )
(define (standardize-quote e)
@@ -468,7 +476,7 @@
(let ((name (segment-variable-true-name e)))
(if (eq? (lookup r name) unbound-pattern)
((standardize-patterns f*)
- (extend r name 'segment)
+ (extends r name 'segment)
(lambda (pattern rr)
(let ((label (gensym)))
(c `(*ssetq-append
@@ -489,7 +497,7 @@
(let ((name (lispish-segment-variable-true-name e)))
(if (eq? (lookup r name) unbound-pattern)
(c `(*setq ,name (*sexp))
- (extend r name 'segment) )
+ (extends r name 'segment) )
(c `(*eval ,name) r) ) ) )
(standardize-segment-variable e f*) ) )