数字を使わないで1+2をやってみる
タイトルだけみると、「またラムダ計算ですか?」って思われそうだけど今回はそうじゃない。
R5RSの仕様を使って、1とか2という"数字"を式の中に書くことなく「1+2」をやるんです。
まぁ解説しながらやると面白くないので、いきなり結果をドンと書いてみる。
以下のコードで「1+2」が表現出来ている。(気がする)
(+ (*) (apply + `(,(*),(*)))) ;; => 3
調子にノって、0*10とかしてみる。
(* (+) (apply + `(,(*),(*),(*),(*),(*) ,(*),(*),(*),(*),(*)))) ;; => 0
とか。
1から10までの和はこんな感じ
(fold + (+) (iota (apply + `(,(*),(*),(*),(*),(*),(*),(*),(*),(*),(*))) (*)))
100000000を表現するにはこんな感じ。
((^x (* x x)) ((^y (* y y)) ((^z (* z z)) (apply + `(,(*),(*),(*),(*),(*),(*),(*),(*),(*),(*))))))
種明かし
まぁみたら分かるとおり、(*)が1、(+)が0として評価されるんですねー。これはR5RSで定義されているのです。
なので、上に書いてるのは1と0に置き換えるとなんてことないのですー。
ただ、見た目的に面白いかなって思ったので、書いてみたかった(後、準クォートっていうのを使ういい機会だった)。<追記>
applyいらね、っていうのに書いた後に気付いたww
とりあえず、いっか…。
どうでも良い事だけど…
Gaucheで(+ ())を評価すると()ってなるのは何故??