Grass interpreter for Cyan language

書きかけのまま放置してたCL用GrassリーダーマクロをCyanに移植しました。とりあえず動いたのでリリース。
https://github.com/youz/cyan-scripts/blob/master/grass.cy
=> 本家 Grass the grass-planting programming language


使い方(ソースより)

# Usage:
# read grass-code from stdin
# $ cyan grass.cy < hello.www
#
# read grass-code from command line
# $ cyan grass.cy -e wWWwwwwWWww
#
# read input from command line
# $ cyan grass.cy -i asdf < echo.www

もしくはテストコードをご覧ください。

$ cyan grass-test.cy

w x 16:
wwwwwwwwwwwwwwww
  => ok

echo:
grass.cy
  => ok

reverse:
yc.ssarg
  => ok

ascii:
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  => ok

id:
  ^(f){ [1, 2, 3].map(f).(==)([1, 2, 3]) }
   => ok

lambda true:
  ^(f){ f('a)('b).(==)('a) }
   => ok

lambda false:
  ^(f){ f('a)('b).(==)('b) }
   => ok

church-num 256:
  ^(f){ f(^(x){ x.(+)(1) })(0).(==)(256) }
   => ok

y-combinator:
  ^(y){ y(fact)(10).(==)(3628800) }
   => ok

meadows:
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww^C

現状Cyanでは文字<->文字コード変換ができないので、ASCII印字可能文字+\n, \r, \t以外を入出力関数で使うと

  • in -> Null文字(\0)として読む
  • out -> "."(ピリオド)を出力

という挙動になります。 (ソースコードには全角のwWvVが使えます。)

その他細かい説明はまた後で