パターンマッチの練習

・パターン式中で、同じパターン変数を使えない
・quoteの扱いが微妙

;Gaucheで
>(use util.match)
>(match '(1 1 1 1) ( (t t t t) #t ) )
*** ERROR: duplicate variable in pattern (t t t t)
>(match '((lambda (x) x) 1) (((lam (var) exp) arg) #t))
#t
>(match '((lambda (x) x) 1) ( (('lambda (var) body) arg) #t ))
#t
>(match '((lambda (x) x) 1) ( (('lam (var) body) arg) #t ))
*** ERROR: : no matching clause for ((lambda (x) x) 1)
>(match '('x) ( ('a) #t ))
*** ERROR: : no matching clause for ('x)
>(match '('x) ( (quot a) #t ))
*** ERROR: : no matching clause for ('x)
>(match '(quote x) ( (quot a) #t ))
#t
>(match '(quote x) ( ('quote a) #t ))
#t
> (define (orz x)
   (match x
    ( (? list? e) (map orz e) )
    ( e (x->integer e) )))
>(orz (list 2 "3" 'hoge))
(2 3 0)

単一化の方が強力なんだけど、じゃあ、パターンマッチングで不十分な時っていつよ?ってなると、私には分からない

Semantics動物園

例えば、ラムダ計算へのマッピングを与えるようなのが、表示的意味論。直接reductionを定義してしまうようなのが、操作的意味論。ラムダ計算の表示的意味論は、ラムダ計算へマッピングしても意味がないので、領域理論とかいうのでやるらしい。あと、公理的意味論というのがあるらしいので、調べていたら、
An axiomatic definition of the programming language PASCAL
というのを見つけた。読んでみたいのだけど、古すぎて(1973年!)、オンラインでは読めないorz


何気に、こんなものが。
A Formal Semantics for the C Programming Language
200ページ以上あるので、読んでないけど、1.4節によれば、Ada , Algol60 ,Pascal , Smalltalk-80に対して表示的意味論を与える試みがあって、EiffelやStandard MLに対して、操作的意味論を与える試みがあったそうな。公理的意味論は、Pascalくらい(´・ω・`)ショボーン

Action Semanticsという謎の意味論は、Ada , Cobol , C++ , Modula-2 , Oberon , Occam , Prolog , Smalltalkに対して使われたそうな。すげえ!Oberonとか初めて聞いたよ。


Cの操作的意味論を与えたとか書いてんな〜、このへんで
http://citeseer.ist.psu.edu/norrish97abstract.html
HOL上で実装したとか書いてあるけど、すると、例えば、Gaucheが実際にR5RSのformal semanticsを満たしてることを証明できるかもしれないんだな。もっとも、仕様上では未定義だけど、大抵の処理系でうまくいくとか、あるいはgccでのみうまくいくとか、そんな裏技が使われてるかもしれないので、一筋縄ではいかないかもしれないけど

#よく考えたら、Gaucheは本格的すぎるので、最初はTinySchemeみたいな小さい処理系でやるか、もういっそ自分でminimalなscheme処理系書くとかした方がいいのか。それから、何気に、Haskellのformal semanticsというのが見当たらない

プログラミング言語は掃いて捨てるほどあるので、各言語に、意味論与えていけば、論文のネタに一生困らないかもしれない(それはない)。Formal Semantics for Perl , Formal Semantics for Ruby , Formal Semantics for BrainF*ck , ...