Emacs Lisp中的foldr,foldl等價於什麼?Emacs Lisp中的foldr,foldl等價於什麼?
20
A
回答
25
如果
(require 'cl)
,那麼你可以使用Common Lisp的功能reduce
。通過foldr
的關鍵字參數:from-end t
。
ELISP> (reduce #'list '(1 2 3 4))
(((1 2) 3) 4)
ELISP> (reduce #'list '(1 2 3 4) :from-end t)
(1 (2 (3 4)))
12
因爲emacs-24.3,我們建議在cl
使用cl-lib
(這是計劃在一些遙遠的未來去除),所以這將是:
(require 'cl-lib)
(cl-reduce #'list '(1 2 3 4))
以來的Emacs-25,你也可以使用包seq
爲:
(require 'seq)
(seq-reduce #'list '(1 2 3 4))
5
Common Lisp library提供了大量的等sequence functions映射,FIL尋找,摺疊,搜索甚至排序。 CL庫在默認情況下與Emacs一起發貨,所以您應該堅持使用它。不過我真的很喜歡dash.el
庫,因爲它爲列表和樹的操作提供了大量的函數。它還支持anaphoric macros並鼓勵函數式編程,這使得代碼簡潔而優雅。
Haskell的褶皺對應與dash.el
摺疊:
foldl
與-reduce-from
foldr
與-reduce-r-from
foldl1
與-reduce
foldr1
與-reduce-r
總和範圍爲1至10採用褶皺看起來就像這個在Haskell和dash.el
:
foldl (+) 0 [1..10] -- Haskell
(-reduce-from '+ 0 (number-sequence 1 10)) ; Elisp
你可能知道,褶皺都非常一般,而且有可能實現通過摺疊地圖和過濾器。例如,要加2的每一個元素,Haskell的鑽營和路段將允許簡潔的代碼,但在elisp的你通常會編寫冗長的一次性lambda表達式這樣的:
foldr ((:) . (+2)) [] [1..10] -- Haskell
(-reduce-r-from (lambda (x acc) (cons (+ x 2) acc)) '() (number-sequence 1 10)) ; Elisp
猜猜看,這是沒有必要dash.el
與指示宏,它允許特殊的語法通過暴露lambda的變量作爲快捷方式,如摺疊it
和acc
。在dash.el
(--reduce-r-from (cons (+ it 2) acc) '() (number-sequence 1 10))
有褶皺狀的很多功能:照應功能開始2個破折號,而不是1
;; Count elements matching a predicate
(-count 'evenp '(1 2 3 4 5)) ; 2
;; Add/multiply elements of a list together
(-sum '(1 2 3 4 5)) ; 15
(-product '(1 2 3 4 5)) ; 120
;; Find the smallest and largest element
(-min '(3 1 -1 2 4)) ; -1
(-max '(-10 0 10 5)) ; 10
;; Find smallest/largest with a custom rule (anaphoric versions)
(--min-by (> (length it) (length other)) '((1 2 3) (4 5) (6))) ; (6)
(--max-by (> (length it) (length other)) '((1 2 3) (4 5) (6))) ; (1 2 3)
相關問題
- 1. foldl/foldr查詢
- 2. 結合foldl和foldr
- 3. foldl with(++)比foldr慢很多
- 4. emacs等價於ct
- 5. 等價類LISP
- 6. #[...]在emacs-lisp中意味着什麼?
- 7. Ruby中的Java CLASSPATH等價於什麼?
- 8. CakePHP中的getLastInsertId()等價於什麼?
- 9. Java中的IntPtr(C#)等價於什麼?
- 10. C中的PHP vsprintf()等價於什麼?
- 11. vala中的g_param_spec_boxed()等價於什麼?
- 12. Javascript中的.sample等價於什麼?
- 13. JavaScript中的DateTime.ToOADate()等價於什麼?
- 14. r中的var_dump()等價於什麼?
- 15. mysql中的REGEXP_SUBSTR等價於什麼?
- 16. C++中的Thread.SetApartmentState等價於什麼?
- 17. 什麼等價於C#中的Microsoft.VisualBasic.Collection?
- 18. Python中的「require」(Ruby)等價於什麼?
- 19. perldb中的'x'等同於emacs中python的pdb的等價物?
- 20. 你推薦的Emacs Lisp是什麼?
- 21. MacVim中emacs填充段的等價物是什麼?
- 22. 在Lisp(Clojure,Emacs Lisp)中,list和quote有什麼區別?
- 23. 什麼是Scheme默認對象的Common Lisp等價物?
- 24. 什麼是go的等價於argv [0]?
- 25. 什麼是C#等價於Java的isInstance()?
- 26. 什麼等價於DB2的Bulk Collect DB2
- 27. 在SML中使用邏輯運算符的foldr/foldl
- 28. Emacs Lisp中的strpos
- 29. Emacs Lisp中的PPRINT?
- 30. 什麼是webdriver等價於assertconfirmation?
這應該更好的是加雷思·雷斯的回答不是在一個單獨的答案評論其自己的權利。 – Thomas 2014-02-07 13:06:12
@Thomas不可能用SO上的例子編寫多行註釋。 – ceving 2018-02-02 08:04:53