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提到的那样。太好了,原子正是我想要的,谢谢!太好了,原子正是我想要的,谢谢!