これはもう一回実装してみるべきだろう、とか。
見た目(だけ)似てるPrologがあったので、Erlangなら案外書けるんじゃないかなー、とか。
思いつきにしても、なんという愚挙…。
でもまぁ、実装しようとすればおのずと動作も解るでしょ。
とお気楽に、ほとんど読めも書けもしないけど面白そうなPrologと格闘開始*1…する前にひげぽん氏による解説みたいなものを読んでおおまかに把握しておくことにする。
…全く理解できてなかった"Operational Semantics"の後半部分が目からウロコだよ!
まぁ"::="と"|"はともかく、"ε"がnil、"::"がconsだと理解できてなかったしなぁ…。
勉強って大切ですねー。
とりあえず、変換規則をErlangに書き下してみた。
文字列から内部表現への変換とかプリミティブとか色々足りないけど、多分こんな感じになるんじゃないかなーと。
-module(grass). -export([exec/1]). exec(Code)-> transform({Code,[out,succ,w,in],[]}). transform({[], [F], []})-> {ok,F}; transform({[{abs,1,C_}|C], E, D})-> transform({C, [{C_,E}]++E, D}); transform({[{abs,N,C_}|C], E, D}) -> transform({C, [{[{abs,N-1,C_}],E}]++E, D}); transform({[], [F|E], [{C_,E_}|D]}) -> transform({C_, [F]++E_,D}); transform({[{app, M, N}|C], E, D}) -> {Cm,Em}=lists:nth(M,E), transform({Cm,[lists:nth(N,E)]++Em, [{C,E}]++D}).
モジュールっぽく書いてありますが、多分動きません。
absやoutやinが色付けされてたりしますが、奴らはアトムなので色付いている意味は無い…はずです。
続きはまたそのうちに。