日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Clojure的学习笔记(二)

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Clojure的学习笔记(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Metadata

identical? 和 java 中的 == 運算符是一個意思。= 和 java 中的 equal 函數是一個意思。

Metadata在Clojure中可以不改變數據的情況下給數據增加metadata,使用with-meta宏和meta宏

(def stu {:name "Stu" :email "stu@thinkrelevance.com"}) (def serializable-stu (with-meta stu {:serializable true}))

那么取數據的結果如下:

(meta stu)nil (meta serializable-stu){:serializable true}

可以用 ^ 代替 meta 來完成上面的工作

當我們根據一個老對象創建一個新對象的時候,老對象的metadata就會跟隨著來到新對象這里。

metadata 可以用來給一個函數指定參數和返回值類型,這在傳統的函數式編程中往往是沒有的,這點缺失也往往成為函數式語言不適合調試的明證。很幸運的是Clojure通過metadata提供了類似的能力。

比如下文我們定義了一個函數,這個函數的參數和返回值都是String類型的:

(defn #^{:tag String} shout [#^{:tag String} s] (.toUpperCase s))

由于metadata的tag參數太常用,在Clojure中可以簡化為下面這個形式:

(defn #^String shout [#^String s] (.toUpperCase s))

這樣,當你用一些不是String的參數來調用shout的時候就會爆出下面的錯誤:

(shout 1) java.lang.ClassCastException: \ java.lang.Integer cannot be cast to java.lang.String

如果你覺得這樣定義的函數看起來有點怪異,那么便可以把這個metadata的定義放到最后來做,不過與普通的函數定義有區別的地方在于,我們要用括號包裹起函數體:

(defn shout ([s] (.toUpperCase s)) {:tag String})

下面是一個有用的metadata的key列表

:arglists doc函數調用時,參數信息

:doc doc函數調用時候,文檔信息

:file 源代碼

:line 代碼當前行數

:macro 如果當前是宏則為真

:name local name

:ns namespace

:tag 期望的返回值或者參數類型

Metadata的read macro: ^#form 和 with-meta 還是不同的,一個是給編譯器增加metadata,一個是給數據加的。

轉載于:https://www.cnblogs.com/mmjx/archive/2011/10/18/2216780.html

總結

以上是生活随笔為你收集整理的Clojure的学习笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。