作为函数式编程的新手,我花了很多精力想“这是函数式的做事方式吗?” 显然,递归与迭代非常简单,很明显递归是做事的功能性方式。但以闭包为例。我已经了解了使用 Lisp 的闭包,并且我了解闭包是函数和环境的组合(听起来很像状态和行为)。例如:
(let ((x 1))
(defun doubleX()
(setf x (* x 2))))
这里我们有一个在 x 变量的环境中定义的函数 doubleX。我们可以将此函数传递给其他函数,然后调用它,它仍然能够引用 x 变量。该函数可以继续引用该变量,即使它是在定义该变量的环境之外调用的。我见过的很多关于闭包的例子都是这样的。其中 setf 用于更改词法变量的值。这让我很困惑,因为:
1.) 我认为 setf 是邪恶的。主要是因为它会引起副作用,而且显然它们也是邪恶的。
2.) 这真的是“功能性的”吗?似乎只是保持全局状态的一种方式,我认为函数式语言是无状态的。
也许我只是不明白闭包。有人可以帮我吗?