非常感謝所有美麗的答案!不能標記只有一個是正確的如何閱讀心理Lisp/Clojure代碼
注:已經
我是新來的函數式編程和維基,而我可以讀函數式編程簡單功能,例如計算一個數的階乘,我發現很難讀大函數。 部分原因是我認爲是因爲我無法弄清函數定義中的小塊代碼,還有一部分原因是我在代碼中難以匹配()
。
如果有人能夠通過閱讀一些代碼,並給我一些關於如何快速解密某些代碼的提示,那將是非常棒的。
注意:如果我盯着它10分鐘,我可以理解這段代碼,但我懷疑這個代碼是否用Java編寫,需要10分鐘。所以,我覺得在Lisp風格的代碼中感覺很舒服,我必須更快地做到這一點
注:我知道這是一個主觀的問題。我在這裏並沒有尋求任何可以證實的正確答案。只是你如何去閱讀此代碼的註釋,將受到歡迎和高度有益
(defn concat
([] (lazy-seq nil))
([x] (lazy-seq x))
([x y]
(lazy-seq
(let [s (seq x)]
(if s
(if (chunked-seq? s)
(chunk-cons (chunk-first s) (concat (chunk-rest s) y))
(cons (first s) (concat (rest s) y)))
y))))
([x y & zs]
(let [cat (fn cat [xys zs]
(lazy-seq
(let [xys (seq xys)]
(if xys
(if (chunked-seq? xys)
(chunk-cons (chunk-first xys)
(cat (chunk-rest xys) zs))
(cons (first xys) (cat (rest xys) zs)))
(when zs
(cat (first zs) (next zs)))))))]
(cat (concat x y) zs))))
體驗?你習慣於閱讀Lisp代碼會更快。然而,關於Lisp的主要抱怨之一是很難閱讀,所以不要期望它很快變得直觀。 – 2009-12-12 18:39:57
這不是一個簡單的功能。如果10分鐘後你能完全理解它,那就很好。 – 2009-12-12 22:57:58