Clojure中全局变量的赋值和使用

Clojure中全局变量的赋值和使用,clojure,Clojure,我有以下问题: 我知道函数式编程语言的概念不允许不可变的变量,所以经典的变量赋值和使用方法就像 var foo = bar(); after that in another function... var baz = funnything(foo); 这是不可能的(如果是,请纠正我,我仍在尝试了解函数式编程背后的全部思想和概念) 我正试着和Clojure玩一玩,到了我卡住的地步: 我想获得一个网页,并将DOM保存到一个变量中供以后使用。 程序启动后,会出现一个提示,用户可以输入一个他想要获

我有以下问题:

我知道函数式编程语言的概念不允许不可变的变量,所以经典的变量赋值和使用方法就像

var foo = bar();

after that in another function...

var baz = funnything(foo);
这是不可能的(如果是,请纠正我,我仍在尝试了解函数式编程背后的全部思想和概念)

我正试着和Clojure玩一玩,到了我卡住的地步:

我想获得一个网页,并将DOM保存到一个变量中供以后使用。 程序启动后,会出现一个提示,用户可以输入一个他想要获取的URL

在获取网站的DOM后,他可以通过获取标题、所有链接等方式在DOM中导航

问题: 因为我不能使用像这样的构造

; More or less pseudo-code
(def page nil)

(get-url [url]
  (page (browser/get url)))

(get-title
    (println (html/select page [:title])))
我必须使用以下构造:

(get-title [url]
    (println (html/select (browser/get url) [:title])))
由于这种结构,每当我想通过
get title
get links
或任何我必须下载的方式访问网站元素时,只要用户在命令提示符下输入其中一种方法,我就可以下载整个网页


我错过什么了吗?Clojure有古典音乐吗?我是不是做错了,在动手实践和边做边学之前,我应该学习更多的函数编程概念?

您可以轻松地缓存(浏览器/get url)的值,这样您就不必每次检查页面的属性时都重新访问页面。请参见
clojure.core/memoize
。但这只能解决部分问题

在您的特定情况下,您的程序需要某种全局(或会话范围)、可变的“当前页面”或至少“当前url”概念,因为这是您希望用户输入和修改的内容。Clojure提供了多个用于管理可变状态的构造


因为一次只处理一页,所以最好使用原子来建模。请参见和

您可以轻松缓存(浏览器/获取url)的值,这样您就不必每次检查页面的属性时都重新蚀刻该页面。请参见
clojure.core/memoize
。但这只能解决部分问题

在您的特定情况下,您的程序需要某种全局(或会话范围)、可变的“当前页面”或至少“当前url”概念,因为这是您希望用户输入和修改的内容。Clojure提供了多个用于管理可变状态的构造


因为一次只处理一页,所以最好使用原子来建模。请参见和

您误解了clojure中的作业

(page (browser/get url))
不等效于:page=browser/get(url),它等效于page(browser/get(url))

我认为你不需要全局变量,只需要可组合函数。您的示例可以如下所示:

(defn get-title [url]
  (let [page (browser/get url)]
    (println (html/select page [:title]))))

如果您想缓存broser/get的返回值,那么使用memoize,就像Joost提到的那样。

您在clojure中误解了赋值

(page (browser/get url))
不等效于:page=browser/get(url),它等效于page(browser/get(url))

我认为你不需要全局变量,只需要可组合函数。您的示例可以如下所示:

(defn get-title [url]
  (let [page (browser/get url)]
    (println (html/select page [:title]))))

如果您想缓存broser/get的返回值,请使用memoize,就像Joost提到的那样。

太好了,原子正是我想要的,谢谢!太好了,原子正是我想要的,谢谢!