私は関数型プログラミングに比較的慣れていないので、「これが関数型のやり方なのか?」という疑問に多くのエネルギーを費やしています。明らかに、再帰と反復は非常に単純であり、再帰が機能的な方法であることは明らかです。しかし、クロージャを例にとってみましょう。私は Lisp を使用してクロージャーについて学び、クロージャーが関数と環境の組み合わせであることを理解しています (状態と動作によく似ています)。例えば:
(let ((x 1))
(defun doubleX()
(setf x (* x 2))))
ここに、x 変数の環境内で定義された関数 doubleX があります。この関数を他の関数に渡して呼び出しても、x 変数を参照できます。関数は、変数が定義されている環境の外で呼び出された場合でも、引き続きその変数を参照できます。私が見たクロージャーの例の多くは、このようなものです。setf を使用して字句変数の値を変更します。これは私を混乱させます:
1.) setf は悪だと思った。ほとんどの場合、それは副作用を引き起こし、明らかにそれらも悪であるためです.
2.) これは本当に「機能的」ですか? グローバルな状態を維持する方法のように思え、関数型言語はステートレスだと思っていました。
クロージャを理解していないだけかもしれません。誰かが私を助けることができますか?