質問: ### 前提・実現したいこと 授業でLispを用いたプログラムの課題が出ました. Lisp初心者のため,簡単な問題もわかりません. 自分でも調べましたが,どうしてもわからず,期限も迫ってきたため,質問させていただきます. ### 該当のソースコード ``` ((lambda (a + b)(+ b a)) 2 - 4) ``` 実行結果は2になりますが,なぜそうなるのかがわかりません. ``` ((lambda (a) (lambda (b) ((sqrt a)(sqrt b)))) 5) ``` 実行結果は#になりますが,なぜそうなるのかがわかりません. ``` >(define arg 5) > (define local-arg 3) > (define (proc arg) (let ((local-arg 2)) (list arg local-arg))) > (proc 1) ``` 実行結果は'(1 2)になりますが,なぜそうなるのかがわかりません. ### 試したこと Lispについてwebで調べてみましたが,あまり理解できませんでした. lambda式についても調べましたが,C++やPythonなどの言語しか触ったことがないので, 全体的に理解できませんでした. 上記の3つのプログラムについて,解説していただければ幸いです. よろしくお願いいたします. ### 補足情報(言語/FW/ツール等のバージョンなど) 実行環境はDrRacketというツールで実行しています. OSはwindows7です.
回答: 1 . ``` ((lambda (a + b)(+ b a)) 2 - 4) ``` `+`に特別な感情を持つとわけわからなくなりますが、 `a`,`b`と同じでただの仮引数名なので、これは ``` ((lambda (a op b)(op b a)) 2 - 4) ``` つまり ``` (- 4 2) ``` となるので2です。 2 . ``` ((lambda (a) (lambda (b) ((sqrt a)(sqrt b)))) 5) ``` 「`a`を渡すと『`b`を渡すと((sqrt a)(sqrt b))を返す関数』を返す関数」 に5を渡すと 『`b`を渡すと((sqrt 5)(sqrt b))を返す関数』 になるので、 `#`になります。 3 . 地道に追ってください。