Skip to content

Instantly share code, notes, and snippets.

@fumieval
Created May 3, 2012 12:23
Show Gist options
  • Save fumieval/2585306 to your computer and use it in GitHub Desktop.
Save fumieval/2585306 to your computer and use it in GitHub Desktop.
最初にこれを書けば良かったのに
#概要
Lazy Kで、無限拡張版九九とクワインを作った(後者は作り直した)。
#なぜLazy Kを選んだか
入力にプログラムを適用した結果を出力とするというシンプルさ、S、K、Iのたった3つの関数であらゆるプログラムを記述できるという性質が非常に美しいから。
#無限九九
九九を無限×無限に拡張した。1以上の自然数からそのデカルト冪へ1つずつ対応させる。
`k`````sii``s`k``s`k`s``s`ks``s`kk``s``s`k```s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks`s`kk``s`k`s`k`s`k`s`k``s`k`s``si`k``s`k``s``s`kski````s``s`ksk```sii``s``s`kski`s``s`ksk```s``siii``s``s`kskik``s``s`ks``s`kk``s`ks``s`k`s`ks`s`kk``s`k`s`k`s`k`s`k``s`k`s``si`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`ksk``s``s`ksk```sii``s``s`ksk``s``s`kskik``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`kk``s`ksk`k``s`ksk`k`k`k``s`k`s``si`k``s`k``s``s`kski``s``s`ksk```sii``s``s`kskik```sii``s`k``s`k`s``s`ks``s`kk``s``s``s``si`k``s``s`ks``s`k`s`ks``s`k`s`k`s``s`k`s`k`s``s`k````s``s`kski``s``s`ksk``s``s`kski``s`k`sikk``s`k`s`kk``s``s`ks``s`kk``si`k``s`k`sik`kk``s``s`ks``s`k`s`ks`s`kk`k`k`s``s`ksk``s`k`s`kk``s``s`ks``s``s`ksk`k`s``s`ksk`k`k`ki`k``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`ki`k`ki``s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`si`s`kk`k`ki`k``s`kk``s`k`s``s`ks``s`k`si``s`kk```s``s`ksk``s``s`kski````s``siii``s``s`kski`s``s`ksk``s`kkk``sii``si`kk``si`k`ki``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`k``s`ksk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ks``s`kk``s`k`s`k`s``s`k``s`k`sikk``s`k`s`kk``s``s`ks``s`kk``si`k``s`k`sik`kk``s`kk``s``s`ks``s``s`ksk`k``s`k`s``si`kik`k`k``s``s`ks``s`k`si``s`kk``s`k`s``s`ksk``si`kk``s`kk``s``s``s``si`k`ki`k``s`k`si``s`kk``si`k`s``s`ksk`k`k`ki`ki``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s``s`k`s`k`s``s`k``s`k`sikk``s`k`s`kk``s``s`ks``s`kk``si`k``s`k`sik`kk``s`k`s`kk``s``s`ks``s``s`ksk`k``s``s`ks``s`k`sik`k`ki`k`k``s``s`ks``s`k`si``s`kk``s``s``s``si`kk`k``s`k`si``s`kk``si`k`s``s`ksk`k`k`ki`ki``s`kk``s`k`s``s`ksk``si`k`ki``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s`kkk`k`k``si`kk`k`k``si`k`ki`k``s`k`sik``sii``s``si`ki`ki``s``s`ks``s`k`si``s`kk``s`k`s``s`ksk``si`kk``s`kk``s``s``s``si`k`ki`k``s`k`si``s`kk``si`k`s``s`ksk`k`k`ki`ki
実行すると、1×1=1、2×1=2、1×2=2、1×3=3、…と無限に1以上の自然数の積が表示される。
#クワイン
Lazy Kでクワインを作った。ここまでたどり着くのに何週間もかかった。
クワインのおおまかな形は、"以下の文字列とその文字列の引用を結合する。「以下の文字列とその文字列の引用を結合する。」"である。
しかし、**Lazy Kに文字列リテラルは存在しない!**
そこで、クワイン専用文字列リテラルというのを作った。0から3までのチャーチ数にs、`、k、iの4つの文字を対応させることで、Lazy KのコードをLazy Kで扱えるようになった。
show、reprの二つの関数がクワインの要になる。
showはクワイン専用文字列リテラルを出力する関数で、reprはチャーチ数のリストをクワイン専用文字列リテラルによる表現にする関数。
これが完成したクワイン。
http://botis.org/shared/quine.lazy
クワイン専用文字列リテラルを生成するために別のプログラムを使用する必要があり、最後はシェルスクリプトで仕上げるという残念仕様。
#IotaとJot
Lazy Kには、*とiだけでプログラムを記述できるIotaと、0と1だけでプログラムを記述できるJotという記法が存在する。
https://gist.github.com/2469354 上段はIotaによるJotのパーサで、下段はJotによるIotaのパーサ。
「機械語で書いた方がいいんじゃないか」というコメントがあったが、機械語で書くよりはずっと短く書けるはずだ。
また、Lazy KはBrainfuckなどと違い、超高級言語なのだ。
#Lazy Kのシンプルさ
Lazy Kは、S、K、Iのたった3つの関数で、様々なプログラムをシンプルに記述できる。
ちょっと前に話題になった、変数を使わずに1から100までの整数の和を求めるプログラムも簡単に作れる。
`k`````sii``s`k``s`k`s``s`ks``s`kk``s``s``s``si`k``s``s`ks``s`k`s`ks``s`k`s`k`s
``s`k`s`k`s``s`k`````ss`ss``ss`ki``s`ksk``s`k`sikk``s`k`s`kk``s``s`ks``s`kk``si
`k``s`k`sik`kk``s``s`ks``s`k`s`ks`s`kk`k`k`s``s`ksk``s`k`s`kk``s``s`ks``s``s`ks
k`k`s``s`ksk`k`k`ki`k``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`ki`k`ki``s`kk``s``s`ks
``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`si`s`kk`k`ki`k``s`kk``s`k`s``s`k
s``s`k`si``s`kk```s``s``si``ss``ss`ki```ss``ssi``ss`kis``s`ksk``s`kkk``sii`````
`s``s`kski```ss```ss`ss``ss`ki``s`ksk``s`k`s``si`k`s``s`ksk``s``s`ksk`k`s``s`ks
k`k`kii`k```sii```sii``s``s`kski
他の言語の場合、標準ライブラリなどを使わずに書くとこれより長いコードが出来上がるだろう。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment