(- x)について
lispをいじっていて、絶対値を返す関数を書いていたときに思った疑問です。
絶対値を返す関数はこんな風にかけます。
(define (abs x) (if (> x 0) x (- x)))
自分で書いていて、「おや?」と思ったので、ちょいと実験をしてみることにしました。
まずは、普通の加算から考えていきます。
(+ 1 2 3 4 5 6 7 8 9 10)
を評価すると55になるでしょ。
これは、リストに含まれている値を全部足しているってことだよね
つまり
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
ってことですよね
じゃあ、マイナスはっていうと
(- 1 2 3 4 5 6 7 8 9 10)
これを評価すると-53になる訳だ。
これが、-55じゃないのがみそで、
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
と同じことだから、-53になるってわけだ。
じゃ
(- 10)
を評価するとどうなるんだろうって思うよね
こいつを評価すると、なんと-10になってしまう訳だ。
こいつは
0 - 10
って解釈されてるんでしょうか?
じゃ、乗算/除算はどうなるのかって疑問に思いますよね?
(print (+ 10)) (print (- 10)) (print (* 10)) (print (/ 10))
こんなことやって試してみました。
結果は、
10 -10 10 1/10
こんな感じになりましたと...
リストに値が一つの場合、加減算のときは0と計算を行い、乗除算のときは1と計算を行うってことなんですかね?
...なんかすっきりとしなくて気持ち悪い