帮你精通Emacs:从JavaScript学会elisp

 对我们 JS 用户而言,学习 Emacs Lisp 似乎很难,但是这一切都是昨日烟云。因为 elisp 虽然古老,但是 library 与时俱进。当我们从 elisp 功勋卓著的 dash.el 起手,一秒钟就会写 elisp。

闲话少叙,直接切入正题。

dash.el 是 专门处理给 elisp 用户处理数组的工具,其与 JS 的 array 一一对应总结如下:

分为1)数组转换(迭代式) 2) 数组转换(非迭代式)3)逻辑判断 4) 操作数据结构 5)排序 五个方面。

一、迭代方法数组变形 Transform (pure function without side effecs)

函数式编程最关键的一点是无须关注iteration的dirty-details,此处归类函数式迭代的方法,将 JS 的 array 方法与 elisp 的 bash.el 库一一对应:

 
 
 
 
  1. ;; 1. reuduce
  2. (-reduce-from (lambda (acc val) (+ acc val))
  3.               0
  4.               '(4 7 8 10))
  5. ;; => 29
  6. ;; 2.map
  7. (-map (lambda (val) (* val 2))
  8.       '(4 7 8 10))
  9. ;; => (8 14 16 20)
  10. ;; 3.flat
  11. (-flatten-n 2 '((1 2) ((3 4) ((5 6)))))
  12. ;; => (1 2 3 4 (5 6))
  13. ;; 4.flatMap with no couterpart
  14. ;; 5.repeat as fill
  15. ELISP> (-repeat 10 0)
  16. (0 0 0 0 0 0 0 0 0 0)
  17. ;; 6.each with side effects
  18. (-each '("x" "y" "z")
  19.   (lambda (val) (princ val)))
  20. ;; => "xyz"

 二、非迭代方法数组变形 non-side-effects

以上6种为函数式的迭代纯函数对数组做变形 transform, 此处将非迭代方法的纯函数单独拎出来归类:

 
 
 
 
  1. ;; 1.concat
  2. (-concat '("x" "y" "z") '( 3 5 6))
  3. ;; => ("x" "y" "z" 3 5 6)
  4. ;; 2.format for join
  5. (format "%s" '("x" "y" "z"))
  6. ;; => "(x y z)"
  7. ;; 3.slice
  8. (-slice '("x" "y" "z" "w") 1 3)
  9. ;; => ("y" "z")

 三、数组的逻辑判断 logic-predicates (non-side-effect)

函数范式的六个methods之后,我们继续考察用于逻辑判断的高阶函数:

 
 
 
 
  1. ;; 1.-filter as js filter
  2. (-filter (lambda (v) (and (> v 30) (< v 100)))
  3.          '(23 76 98 10))
  4. ;; =>  (76 98)
  5. ;; 2. find or first as js find
  6. (-find (lambda (v) (and (> v 30) (< v 100)))
  7.          '(23 76 98 10))
  8. ;; => 76
  9. ;; 3. -find-index as js findIndex
  10. (-find-index  (lambda (v) (and (> v 30) (< v 100)))
  11.          '(23 76 98 10))
  12. ;; => 1
  13. ;; 4.contains-p as js includes
  14. (-contains-p '(23 76 98 10) 76)
  15. ;; t
  16. ;; 5. -elem-index as indexOf
  17. (-elem-index 76 '(23 76 98 10))
  18. ;; => 1
  19. ;;6.some
  20. (-some (lambda (v) (and (> v 30) (< v 100)))
  21.        '(23 76 98 10))
  22. ;; => t
  23. ;;7.every
  24. (-every (lambda (v) (and (> v 30) (< v 100)))
  25.        '(23 76 98 10))
  26. ;; => false

 四、数据结构操作

Array可以作为两种抽象结构数据的载体:分别为 stack 和 queue。

1) push 2) pop 3) shift 4) unshift 5)splice(splice属于特殊方法,因为更改了原数组,放在此处)

 
 
 
 
  1. ;;1.append element to the end of array (array.push)
  2. (append '(23 76 101 89) 67)
  3. ;; => (23 76 101 89 . 67)
  4. ;;2.nbutlast to remove last element(array.pop)
  5. (nbutlast  '(23 76 101 89))
  6. ;; => (23 76 101)
  7. ;;3.remove first element(array.shift)
  8. ELISP> (let ((l '(23 76 89)))
  9.          (pop l)
  10.          l)
  11. (76 89)
  12. ;;4. add element to the front (array.unshift)
  13. ELISP> (let ((l '(23 76 89)))
  14.          (push 12 l)
  15.          l)
  16. (12 23 76 89)
  17. ;;5.insert to list at position n (array.splice)
  18. (-insert-at 1 'x '(a b c)) ;; => (a x b c)
  19. ;;let arr = [a, b, c]; arr.splice(1, 0, x); arr
  20. ;;6.replace at potion (array.splice)
  21. (-replace-at 0 9 '(0 1 2 3 4 5)) ;; => (9 1 2 3 4 5)
  22. ;;let arr = [1, 2, 3, 4, 5]; arr.splice(0, 1, 9); arr

 五、数组排序

最后以无处而不在的排序收尾,无论是 sort 还是 reverse 都直接在原数组上修改,也就是 inplace 操作。

 
 
 
 
  1. (-sort '< '(3 1 2)) ;; => (1 2 3)
  2. (-sort '> '(3 1 2)) ;; => (3 2 1)
  3. ;; 完全就是 

 六、总结

通过以上总结,我们发现,即使不看文档,也能立刻上手开始写 elisp。

分享题目:帮你精通Emacs:从JavaScript学会elisp
链接URL:http://www.shufengxianlan.com/qtweb/news26/445476.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联