日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
幫你精通Emacs:從JavaScript學(xué)會(huì)elisp

 對(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)是無(wú)須關(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. ;; 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"

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

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

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

 三、數(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. ;; 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

 四、數(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. ;;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

 五、數(shù)組排序

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

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

 六、總結(jié)

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


當(dāng)前文章:幫你精通Emacs:從JavaScript學(xué)會(huì)elisp
當(dāng)前地址:http://www.5511xx.com/article/cohpeoo.html