(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

数字を使わないで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で(+ ())を評価すると()ってなるのは何故??