emacs एमएक्स लिस्प में गुणा, गुनाह के बराबर क्या है?




lisp elisp (3)

एमएक्स लिस्प में गुणा, गुनाह के बराबर क्या है?


आम लिस्प पुस्तकालय मैपिंग, फिल्टरिंग, फोल्डिंग, खोज और यहां तक ​​कि छंटनी जैसी अनुक्रम कार्यों के बहुत सारे प्रदान करता है। सीएल लाइब्रेरी को एएमएसीएस के साथ डिफॉल्ट रूप से भेज दिया जाता है, इसलिए आपको इसे छड़ी करना चाहिए। मैं हालांकि वास्तव में dash.el पुस्तकालय की तरह है, क्योंकि यह सूची और पेड़ जोड़तोड़ के लिए बहुत अधिक मात्रा में फ़ंक्शन प्रदान करता है। यह एनाफोरिक मैक्रोज़ का भी समर्थन करता है और कार्यात्मक प्रोग्रामिंग को प्रोत्साहित करता है, जो कोड संक्षिप्त और सुरुचिपूर्ण बनाता है।

हास्केल की परतें dash.el संबंधित हैं:

1 से 10 की श्रेणी का उपयोग dash.el और dash.el :

foldl (+) 0 [1..10] -- Haskell
(-reduce-from '+ 0 (number-sequence 1 10)) ; Elisp

आप शायद जानते हैं कि यह परतें बहुत सामान्य हैं, और नक्शे और फ़िल्टर को सिलवटों के माध्यम से कार्यान्वित करना संभव है। उदाहरण के लिए, प्रत्येक तत्व को 2 से बढ़ाना, हास्केल की करीरी और अनुभागों में संक्षिप्त कोड की अनुमति होगी, लेकिन एलिसप में आप आमतौर पर वर्बोज़ थ्रोएव भेड़िये जैसे लिखा करते हैं:

foldr ((:) . (+2)) [] [1..10] -- Haskell
(-reduce-r-from (lambda (x acc) (cons (+ x 2) acc)) '() (number-sequence 1 10)) ; Elisp

लगता है कि क्या, एनाफोरिक मैक्रोज़ के साथ डैश.ल में जरूरी नहीं है, जो लैंबडा के वेरिएबल्स को शॉर्टकट के रूप में उजागर करके विशेष सिंटैक्स की अनुमति देता है, जैसे कि it और acc में। अनुबादिक कार्य 1 के बजाय 2 डैश से शुरू होते हैं:

(--reduce-r-from (cons (+ it 2) acc) '() (number-sequence 1 10))

dash.el में बहुत गुना-जैसे कार्य हैं:

;; 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)

चूंकि एमएसीएस -24.3 हम cl-lib पर cl-lib का उपयोग करने की सलाह देते हैं (जो कुछ दूर के भविष्य में हटाने के लिए योजनाबद्ध है), इसलिए यह होगा:

(require 'cl-lib)
(cl-reduce #'list '(1 2 3 4))

और Emacs-25 के बाद से, आप इसके लिए seq पैकेज का भी उपयोग कर सकते हैं:

(require 'seq)
(seq-reduce #'list '(1 2 3 4))

अगर तुम

(require 'cl)

तो आप सामान्य लिस्प समारोह को reduce कर सकते हैं। कुंजीशब्द तर्क को पास करें :from-end t लिए foldr

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)))




elisp