Giraffe+ 0.5.7.196

Downloadページへ

前リリースからの変化

  • ShowMenu2が未選択状態でEnterキーを打たれた場合にGiraffe+が強制終了してたのを修正
  • \x{nnnn}という構文で、ダブルクォートリテラル文字列と文字リテラルのバックスラッシュ構文に、Unicode文字を書けるようにした
  • Object.type?を、そのサブタイプであってもtrueを返すようにした(Lispのtypepと同じにした)
  • Context.call_fileに空ファイルを渡すと強制終了してたのを修正
  • Object.if, unless, ?, !は、引数をtrue-block *(else-if-compare-block else-if-true-block) else-blockと受けるようにした
  • コンマを使って、演算子風メソッドに複数の引数を与えられるようにした(例: x.== 0.? ['x is zero'], ['x isnt zero'])
  • Array.set_atがatを使わずサブスクリプトオペレータ(index_setが使うやつ)を使っていたのを修正
  • Container.collectがindex_setではなくset_atを無意味に使っていたのを修正

細かい修正以外で補足が必要そうな部分について述べます。
\x{nnnn}は、gsの正規表現であるPerl正規表現からの採用です。このnnnnは1文字以上4文字以下の16進数です。\x{0}も\x{0000}も同じです。普通の\xnnは、2文字までですので、Unicode文字は記述できません。
次、Object.type?について。Int.type?(:Int)は当然true、さらに、Int.type?(:Number)もtrueになりました。全てのオブジェクトはObjectの子供(孫等含む)ですので、x.type?(:Object)は常にtrueになります。falseになる例を一応挙げておくと、Int.type?(:String)なんかがそうなります。
if等の仕様変更とコンマの追加は一緒に使うことを考えてのことです。
C言語でこう書く場合:

if(x == 0)
  return "x is zero";
else if(x == 1)
  return "x is one";
else
  return "x isn't zero or one";

gsではこう書きます:

x.== 0.? [
  "x is zero".return
], [x.== 1], [
  "x is one".return
], [
  "x isn't zero or one".return
]

Cではswitchを使うとか、gsではreturnは最後にまとめるとか、そういう話は置いておいて、こういう感じになります。
見て分かるとおり、あまりいいものではありませんが、以前のif-else(if-else(if-else))とネストしていくしかない仕様に比べればましになったと思います。
if-elseを書きたい時に括弧の省略が出来なかったのも解決しました。コンマで複数行にわたる多くの引数をつなげると分かりにくいですが、2つだけなら大丈夫です。
また、将来的な話ですが、ファイルをLispRubyのように扱うようになった場合にブロックを括弧内に置かなければならなかった問題が解決しました。

File.open& 'file.txt', 'r', `f[
  f.line_range.each& `line[
    ...
  ]
]

全く実装予定はありませんが。