言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Joy 言語の実際。j09imp.html を読む。

復習の為に http://www.latrobe.edu.au/philosophy/phimvt/joy/j09imp.html を読んでいます。番号は 9 番ですが、これを最初に読まないと他のドキュメントを試す事が出来ません。

実行

joy インタプリタは、標準入力を読み込み以下の動作のいずれかを繰り返す。

  • 複定義文 : 辞書に定義を追加
  • 項 + "END" または "." : スタックの先端を出力

項の内容

  • 先頭が $ の行はシェルが実行する。
    • 例: $ ls
  • コメントは (* *) もしくは行指向コメント #
    • 例: (* comment *)
    • 例: # comment
  • 特殊記号
    • []{};.
  • 整数定数
    • 例: -100 (最大値は普通 2の 31 乗)
  • 特殊文字
    • 例: \n C と同じ
  • 文字定数
    • 例: 'a'
  • 文字列定数
  • 予約語
    • ==
    • MODULE
    • PRIVATE, HIDE (別名)
    • PUBLIC, IN, DEFINE, LIBRA (別名)
    • END

定義文

  • 複定義文は次の形をしている。
    • MODULE 名前 PRIVATE 定義; 定義; ... PUBLIC 定義; 定義; ... END(または .)
    • MODULE, PRIVATE, PUBLIC は省略出来る。
    • HIDE 定義; 定義; ... IN 定義; 定義; ... END(または .)
    • DEFINE 定義; 定義; ... END(または .)
    • LIBRA 定義; 定義; ... END(または .)
  • 定義は複定義または単定義から成る。単定義は以下の形をしている。
    • 名前 == 項

DEFINE hello == "Hello world" END
LIBRA morning == "Good morning"; night == "Good night".

DEFINE や LIBRA は単に PUBLIC の別名だと書いてあるが、そうでも無いみたい。

Joy の起動

  • カレントディレクトリに "usrlib.joy" があれば実行してからメインサイクルに移る。
  • ファイルに書かれたプログラムを実行するにはリダイレクト使う。その場合もカレントディレクトリの "usrlib.joy" が最初に実行される。
  • コマンドラインオプション付きで実行すると、第一引数はファイル名として扱われ標準入力の代わりに使われる。オプションの全体は argv で取得出来る。
  • #! を使ったスクリプトを作成できる。
#!joy
"Hello World!" .

入出力

標準で Joy は . が現れるたびにスタックの内容を出力する。しかし setautoput を使ってこの動作を変更する事も出来る。

  • 0 setautoput : 自動出力を無効
  • 1 setautoput : 自動出力を有効(標準)

入力エコーの制御が出来る。(ファイル入力をトレースするのに便利)

  • 0 setecho : エコー無効
  • 1 setecho : 変更でエコー
  • 2 setecho : tab をつけてエコー
  • 3 setecho : 行番号と tab をつけてエコー

明示的な入出力

  • オブジェクト put : オブジェクトを出力
  • 数字 putch : 数字に対応する文字を出力
  • "ファイル名" include : 他のファイルから入力を行う

エラー

  • 文法エラー : 文法エラー
  • 実行エラー : スタックのプロジェクトが足りなかったり型が違う。

ライブラリ

  • usrlib.joy : 最初に読むファイルのサンプル
  • inilib.joy : 色々便利な関数集を読み込む。
  • inilib.joy に定義された all-libsload で以下のライブラリを読み込む。

ヘルプ

  • help. 定義されている名前が表示される。
  • [名前] helpdetail. 名前の定義が表示される。