自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

幫你精通Emacs:從JavaScript學(xué)會(huì) elisp

開發(fā) 前端
學(xué)習(xí) Emacs Lisp 似乎很難,但是這一切都是昨日煙云。因?yàn)?elisp 雖然古老,但是 library 與時(shí)俱進(jìn)。當(dāng)我們從 elisp 功勛卓著的 dash.el 起手,一秒鐘就會(huì)寫 elisp。

[[390854]]

 對(duì)我們 JS 用戶而言,學(xué)習(xí) Emacs Lisp 似乎很難,但是這一切都是昨日煙云。因?yàn)?elisp 雖然古老,但是 library 與時(shí)俱進(jìn)。當(dāng)我們從 elisp 功勛卓著的 dash.el 起手,一秒鐘就會(huì)寫 elisp。

閑話少敘,直接切入正題。

dash.el 是 專門處理給 elisp 用戶處理數(shù)組的工具,其與 JS 的 array 一一對(duì)應(yīng)總結(jié)如下:

分為1)數(shù)組轉(zhuǎn)換(迭代式) 2) 數(shù)組轉(zhuǎn)換(非迭代式)3)邏輯判斷 4) 操作數(shù)據(jù)結(jié)構(gòu) 5)排序 五個(gè)方面。

一、迭代方法數(shù)組變形 Transform (pure function without side effecs)

函數(shù)式編程最關(guān)鍵的一點(diǎn)是無須關(guān)注iteration的dirty-details,此處歸類函數(shù)式迭代的方法,將 JS 的 array 方法與 elisp 的 bash.el 庫(kù)一一對(duì)應(yīng):

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

 二、非迭代方法數(shù)組變形 non-side-effects

以上6種為函數(shù)式的迭代純函數(shù)對(duì)數(shù)組做變形 transform, 此處將非迭代方法的純函數(shù)單獨(dú)拎出來歸類:

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

 三、數(shù)組的邏輯判斷 logic-predicates (non-side-effect)

函數(shù)范式的六個(gè)methods之后,我們繼續(xù)考察用于邏輯判斷的高階函數(shù):

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

 四、數(shù)據(jù)結(jié)構(gòu)操作

Array可以作為兩種抽象結(jié)構(gòu)數(shù)據(jù)的載體:分別為 stack 和 queue。

1) push 2) pop 3) shift 4) unshift 5)splice(splice屬于特殊方法,因?yàn)楦牧嗽瓟?shù)組,放在此處)

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

 五、數(shù)組排序

最后以無處而不在的排序收尾,無論是 sort 還是 reverse 都直接在原數(shù)組上修改,也就是 inplace 操作。

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

 六、總結(jié)

通過以上總結(jié),我們發(fā)現(xiàn),即使不看文檔,也能立刻上手開始寫 elisp。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-03-26 07:51:51

Emacs應(yīng)用buffer

2021-03-29 08:14:49

Emacs應(yīng)用配置日程

2021-01-13 11:25:12

JavaScript閉包函數(shù)

2021-03-19 08:38:12

Emacs應(yīng)用windows

2020-12-14 09:58:04

LinuxManuatldr

2021-01-27 12:22:08

Python爬蟲代碼

2020-12-21 10:55:41

Linux系統(tǒng)ls命令

2023-05-09 08:25:26

Gaussdb數(shù)據(jù)庫(kù)開源數(shù)據(jù)庫(kù)

2010-02-06 15:31:18

ibmdwAndroid

2009-07-22 14:55:16

ibmdwAndroid

2016-12-08 22:39:40

Android

2017-05-09 08:48:44

機(jī)器學(xué)習(xí)

2021-04-08 09:14:24

js前端函數(shù)

2017-01-20 09:45:20

JavaScript代碼質(zhì)量

2022-06-10 08:17:52

HashMap鏈表紅黑樹

2021-07-07 06:16:29

EmacsMeta鍵編程

2020-12-17 08:14:30

Linuxrsync備份

2009-02-12 18:02:15

2010-11-08 10:20:18

2024-02-26 08:52:20

Python傳遞函數(shù)參數(shù)參數(shù)傳遞類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)