Clojure функции для Emacs? - PullRequest
       24

Clojure функции для Emacs?

9 голосов
/ 08 октября 2010

Мне интересно, существует ли набор кода Emacs Lisp, который реализует некоторые функции Clojure. Например, -> и - >> и comp и частичные, и другие?

Спасибо.

Ответы [ 4 ]

12 голосов
/ 08 октября 2010

Я портировал макросы -> и ->> в Emacs Lisp некоторое время назад.Я иногда использую их в своем коде конфигурации, и они, кажется, работают нормально.

(defmacro -> (e &rest es)
  (if (and (consp es) (not (consp (cdr es))))
      (if (consp (car es))
          `(,(caar es) ,e ,@(cdar es))
        `(,(car es) ,e))
    (if (consp es)
        `(-> (-> ,e ,(car es)) ,@(cdr es))
      e)))

(defmacro ->> (e &rest es)
  (if (and (consp es) (not (consp (cdr es))))
      (if (consp (car es))
          `(,@(car es) ,e)
        `(,(car es) ,e))
    (if (consp es)
        `(->> (->> ,e ,(car es)) ,@(cdr es))
      e)))
4 голосов
/ 29 июня 2013

Вы обязательно должны взглянуть на dash.el . Он предоставляет множество функций в стиле Clojure, таких как:

  • -карта (fn list)
  • -снижение-от (fn initial-value list)
  • -reduce-r-from (fn initial-value list)
  • -снизить (fn list)
  • -reduce-r (fn list)
  • -фильтр (pred list)
  • -Удаление (pred list)
  • -поддержать (fn list)
  • -map-when (pred rep list)
  • -индексирован (fn list)
  • -флаттен (l)
  • -конкат (&rest lists)
  • -mapcat (fn list)
  • -конс * (&rest args)
  • -счет (pred list)
  • -люба? (pred list)
  • -все? (pred list)
  • -Ни? (pred list)
  • -только-некоторые? (pred list)
  • - каждый (list fn)
  • -each-while (list pred fn)
  • -частей (num fn)
  • -повтор (n x)
  • -слайс (list from &optional to)
  • -принимать (n list)
  • -точка (n list)
  • -принимать-пока (pred list)
  • -рабочий (pred list)
  • -сплит-в (n list)
  • -insert-at (n x list)
  • -сплит-с (pred list)
  • -раздельный (pred list)
  • -раздел (n list)
  • -разделение по шагам (n step list)
  • -шаговое разбиение (n step list)
  • -partition-all (n list)
  • -разделение (fn list)
  • -разделение по заголовкам (fn list)
  • -группа (fn list)
  • -интерпозировать (sep list)
  • - чередование (&rest lists)
  • -zip-with (fn list1 list2)
  • -zip (list1 list2)
  • -первый (pred list)
  • -last (pred list)
  • -союз (list list2)
  • -разница (list list2)
  • - пересечение (list list2)
  • - различие (list)
  • -contains? (list element)
  • -сортировка (predicate list)
  • -частичный (fn &rest args)
  • -rpartial (fn &rest args)
  • -применить (fn)
  • -> (x &optional form &rest more)
  • - >> (x form &rest more)
  • -> (x form &rest more)
  • -когда-пусть (var-val &rest body)
  • -когда-пусть * (vars-vals &rest body)
  • -if-let (var-val then &optional else)
  • -if-let * (vars-vals then &optional else)
  • ! Cons (car cdr)
  • ! Cdr (list)

Я считаю эту библиотеку чрезвычайно полезной.

2 голосов
/ 08 октября 2010

Не уверен насчет остальных, но в Emacs ветка lexbind реализована как частичная, как "curry".

0 голосов
/ 28 июня 2013

Я недавно написал эти макросы. Они не рекурсивны и менее многословны. Но я еще не проверил их всесторонне.

(defmacro ->> (x &rest forms)
  (while forms
      (setq x (append (pop forms) (list x))))
    x)

(defmacro -> (x &rest forms)
  (while forms
    (let ((form (pop forms)))
      (push x (cdr form))
      (setq x form)))
  x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...