FC2ブログ
--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

02.12
Tue
Haskellみたいな直感的なパターンマッチがLispでもできないかと思い

マクロを書いてるんですけどどうにもうまくいかない...

てか、Gaucheのutil.matchにそれっぽいものあるみたいだし

自分で書く意味ねーじゃん的なアレなんですが、まー書きだしてしまったし

マクロ書くお勉強という事でやってます

どんな感じのパターンマッチかというと

以下みたいな感じになって欲しい

(define (fact n)
    (match-with n
        (0 1)
        (otherwise (* n (fact (- n 1))))))


これをやるマクロはまぁ書けた

次.

(define (search elm lst)
    (match-with lst
        (() #f)
        ((x . xs) (if (equal? x elm) #t (search elm xs)))))


こんな感じのパターンマッチもできた

じゃ、なにができないというと、

パターンマッチして変数束縛を作るようなやつ.ようするに

(1 2 (3 (4 5) 6) 7) のリストに対して (a _ (b (4 _) c) _)

みたいなの(この場合((a 1) (b 3) (c 6))になってパターンマッチは成功)

もちろんパターンに照らし合わせてリストを走査して束縛対をつくるとこまでは出来るんですがそれを

マクロで使うにはどうしたらいいのかちょっとわからない

マクロでどういうS式を作るかって方針はcondとletを組み合わせてやろうとしてるんですけど

それがいけないのかな...


(match-with target
    ((x . xs) 処理1 ...)  
    ((a _ b (c _)) 処理1 ...))

こんな感じのやつを

(cond
    ((match? (x . xs) target) 
        (let ((x 値1) (xs 値2)) 処理1 ...))
    ((match? (a _ b (c _))) 
        (let ((a 値1) (b 値2) (c 値3)) 処理1 ...)))


大きく表示した、変数と値の束縛のとこを返す関数ができてるので

あとそれをどうマクロの中で使えばいいのかよくわからない...
スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/164-8d99274b
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。