Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-10-25

Cyan面白い

| 01:56 | Cyan面白い - わだばLisperになる を含むブックマーク はてなブックマーク - Cyan面白い - わだばLisperになる

L-99でトラックバックが飛んで来たのでTB元を覗いてみたのですが、LISP風なマクロが書けつつS式でないという面白い俺言語の作者さんのブログでした。

この俺言語はCyan(さいあん)というらしいのですが、面白そうなので早速インストール。

インストールは、Ubuntu 8.04では「→サービス終了のお知らせ - Yahoo!ジオシティーズ」のページからダウンロードして展開するだけでした。

マクロが書けるということで、やっぱり早速マクロを書いてみようという感じなのですが、とりあえず、aifだろうということで、作ってみました。

mac(aif)^(pred, con, alt):
  `let^(&opt it = ?pred):
     if(it):
       ?con
      else:
       ?alt

aif("こんにちは", say(it), say(it))
#=> こんにちは。

しかし、これだと、構文っぽくないので、サンプルコードを探していたら、なんと最初からaifが定義してありました(*'-')

ということで、それを参考に書き直し

mac(maif)^(pred, con, &key alt):
  `let^(&opt it = ?pred):
     if(it, ?con, :else ?alt)

maif("こんにちは"):
  say(it)
 else:
  false
#=> こんにちは

aifが最初から備え付けであったので、じゃあ、when-letを定義してみようということで、定義してみました。

mac(whenlet)^(var, val, body):
  `let^(&opt ?var = ?val):
     if(?val, ?body, :else false)

whenlet(x, 3):
  say(x)
#=> 3

Cyanのletの形式と合せる程マクロの書き方を分かっていないので中途半端な感じなのですが、色々探っていたら、Cyanの場合、元から、if等は、if-letの様な動きをすることが分かりました。

if(x = "そのとおり"):
  say("はい" + x)
 else:
  say("いいえ")
#=> はいそのとおり

なるほど! これは便利。

他にもCyanには面白いところが沢山あるので動かして色々試してみると楽しいと思います!