Guest User

Untitled

a guest
Dec 17th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. (defmacro alist-map-cons (&rest args)
  2. (let* ((last (- (length args) 1))
  3. (head (car args))
  4. (tail (cdr args)))
  5. `(cl-loop for item in ,head
  6. if (consp item)
  7. ,@tail)))
  8.  
  9. (defun alist-repr (alist)
  10. (format "(%s)" (alist-map-cons alist concat (format "%S" item))))
  11. ;; (alist-repr '((a . 1) (b . 2) c)) => "((a . 1)(b . 2))"
  12.  
  13. (defun alist-print (alist)
  14. (message (string-join (split-string (alist-repr alist) ")(") ")\n (")))
  15. ;; (alist-print '((a . 1) (b . 2) c)) => "((a . 1)
  16. ;; (b . 2))"
  17.  
  18. (defun alist-len (alist)
  19. (alist-map-cons alist sum 1))
  20. ;; (alist-len '((a . 1) (b . 2) c)) => 2
  21.  
  22. (defun alist-items (alist)
  23. (alist-map-cons alist collect item))
  24. ;; (alist-items '((a . 1) (b . 2) (c . 3))) => ((a . 1) (b . 2) (c . 3))
  25. ;; (alist-items '((a . 1) (b . 2) c)) => ((a . 1) (b . 2))
  26.  
  27. (defun alist-keys (alist)
  28. (alist-map-cons alist collect (car item)))
  29. ;; (alist-keys '((a . 1) (b . 2) (c . 3))) => (a b c)
  30. ;; (alist-keys '((a . 1) (b . 2) c)) => (a b)
  31.  
  32. (defun alist-values (alist)
  33. (alist-map-cons alist collect (cdr item)))
  34. ;; (alist-values '((a . 1) (b . 2) (c . 3))) => (1 2 3)
  35. ;; (alist-values '((a . 1) (b . 2) c)) => (1 2)
  36.  
  37. (defun alist-remove (alist key)
  38. (alist-map-cons alist
  39. if (not (equal key (car item)))
  40. collect item))
  41. ;; (alist-remove '((a . 1) (b . 2) (c . 3)) 'b) => ((a . 1) (c . 3))
  42. ;; (alist-remove '((a . 1) (b . 2) c) 'b) => ((a . 1))
  43.  
  44. (defun alist-set (alist key val)
  45. (let* ((found nil)
  46. (alist (alist-map-cons alist
  47. if (equal key (car item))
  48. collect (cons key val)
  49. and do (setq found t)
  50. else
  51. collect item end)))
  52. (if found alist
  53. (append alist (list (cons key val))))))
  54. ;; (alist-set '((a . 1) (b . 2)) 'c 3) => ((a . 1) (b . 2) (c . 3))
  55. ;; (alist-set '((a . 1) (b . 2)) 'b 3) => ((a . 1) (b . 3))
  56.  
  57. (defun alist-pop (alist key)
  58. (let* ((result)
  59. (alist (alist-map-cons alist
  60. if (equal key (car item))
  61. do (setq result (cdr item))
  62. else
  63. collect item)))
  64. (cons alist result)))
  65. ;; (alist-pop '((a . 1) (b . 2) (c . 3)) 'b) => (((a . 1) (c . 3)) . 2)
  66. ;; (alist-pop '((a . 1) (b . 2) c) 'c) => (((a . 1) (b . 2)))
  67.  
  68.  
  69. (defun alist-merge (a b)
  70. (if (not b) a
  71. (-let* ((((key . value) . b) b)
  72. (a (alist-set a key value)))
  73. (alist-merge a b))))
  74. ;; (alist-merge '((a . 1) (c . 3)) '((b . 2))) => ((a . 1) (c . 3) (b . 2))
  75. ;; (alist-merge '((a . 1) c) '((b . 2))) => ((a . 1) (b . 2))
Add Comment
Please, Sign In to add comment