@@ -68,13 +68,13 @@ | E BINOP E $(D_COMMENT # 二項演算子いろいろ) | E "." ID $(D_COMMENT # テーブルのフィールドアクセス) | E ".?" ID $(D_COMMENT # テーブルにフィールドがあるか否か) | E "{" ENTRYS "}" $(D_COMMENT # テーブル拡張) - | "if" "(" E ")" "{" E "}" - | "if" "(" E ")" "{" E "}" "else "{" E "}" + | "if" E ("then"|":"|"then" ":") E + | "if" E ("then"|":"|"then" ":") E "else" ":"? E $(D_COMMENT # パターンマッチ) - | "case" "(" E ")" ("when" "(" PATTERN ")" "{" E "}")* + | "case" E ("when" PATTERN ":" E )* where PATTERN ::= 式がだいたいなんでも書ける気がする $(D_COMMENT # レイヤ指定実行) @@ -91,10 +91,10 @@ 規則の詳細を説明するのが面倒なので適当に想像して下さい。 他の書き換えはこんな感じです。

-    if (E) {E}          ⇒ if( E, fun(){E}, fun(){} )
-    if (E) {E} else {E} ⇒ if( E, fun(){E}, fun(){E} )
+    if E then E         ⇒ if( E, fun(){E}, fun(){} )
+    if E then E else E  ⇒ if( E, fun(){E}, fun(){E} )
     E BINOP E           ⇒ BINOP(E, E)
     { ENTRIES }         ⇒ {}{ ENTRIES }
     {}                  ⇒ {}()
     E {ID:E, ...}       ⇒ .=(E, ID, E) { ... }
@@ -112,9 +112,10 @@
    def x = E ; E
 

以上のどれも同じ意味なので、なんとなく関数型っぽく書きたい気分の日は let in を、 -手続き型っぽく書きたい気分の日は var ; を使うとよいでしょう。 +手続き型っぽく書きたい気分の日は var ; を使うとよいと思います。 +if then else も微妙にコロンがあったりなかったりバリエーションがありますが好みで使います。

関数を宣言するときは、funλ を省略できます。 以下の書き換えが行われます。 @@ -146,9 +147,9 @@

一方で、"let rec" のような特別な構文はありませんが、

-   let f = fun(x) { if(x==0){1}else{x*f(x-1)} } in f(10)  $(D_COMMENT # 3628800)
+   let f = fun(x) { if x==0 then 1 else x*f(x-1) } in f(10)  $(D_COMMENT # 3628800)
 

再帰的な関数定義なども、おそらく意図されたとおりに動きます。 内部の詳細は、諸般の事情により、 @@ -225,12 +226,12 @@

     def adjSum(lst)
     {
-      case( lst )
-        when( {car:x, cdr:{car: y, cdr:z}} ) { {car: x+y, cdr: adjSum(z)} }
-        when( {car:x, cdr:{}} ) { lst }
-        when( {} ) { {} }
+      case lst
+        when {car:x, cdr:{car: y, cdr:z}}: {car: x+y, cdr: adjSum(z)}
+        when {car:x, cdr:{}}: lst
+        when {}: {}
     }
 

動かすときには、処理系がそれっぽい if-then-else に展開しています。 @@ -249,11 +250,11 @@ 外で束縛された変数を値パターンとして配置、は直接はできないので

    var x = 123;
-   case( foo )
-     when( {val: x+0} ) { ... } $(D_COMMENT # これは任意の {val:123} と同じ)
-     when( {val: x} ) { ... }   $(D_COMMENT # これは任意の foo.?val なら常にマッチ)
+   case foo
+     when {val: x+0}: ... $(D_COMMENT # これは {val:123} と同じ)
+     when {val: x}:   ... $(D_COMMENT # これは任意の foo.?val なら常にマッチ)
 

適当にちょっと複雑な式にしてやるとよいかも(裏技)。

@@ -261,9 +262,9 @@ テーブルパターンは、書かれたキーが全てあればマッチします。 {a: _} は、.a を持ってさえいればマッチするので、 {a: 123, b: 456} なんかにもマッチします。 なので、リストに対するパターンを書くときには、car/cdr の場合を先に書かないと -when({}) を上に書くと全部マッチしちゃいます。注意。 +when {} を上に書くと全部マッチしちゃいます。注意。

)) ) ))