LINUX.ORG.RU

История изменений

Исправление Nervous, (текущая версия) :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such value
(println (enum-value-index 'my-enum 'no-such-value))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %) А по краткости и понятности — даже лучше.

Можно и вообще без макросов, ага. Просто придётся больше имён квотить.

Исправление Nervous, :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such value
(println (enum-value-index 'my-enum 'no-such-name))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %) А по краткости и понятности — даже лучше.

Можно и вообще без макросов, ага. Просто придётся больше имён квотить.

Исправление Nervous, :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such name
(println (enum-value-index 'my-enum 'no-such-name))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %) А по краткости и понятности — даже лучше.

Можно и вообще без макросов, ага. Просто придётся больше имён квотить.

Исправление Nervous, :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such name
(println (enum-value-index 'my-enum 'no-such-name))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %)

Можно и вообще без макросов, ага. Просто придётся больше имён квотить.

Исправление Nervous, :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such name
(println (enum-value-index 'my-enum 'no-such-name))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %)

Можно и вообще без макросов, ага. Просто придётся больще имён квотить.

Исправление Nervous, :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such name
(println (enum-value-index 'my-enum 'no-such-name))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %)

Можно и вообще без макросов, ага.

Исходная версия Nervous, :

Без сайд эффектов в макросах это как сделать в Clojure?

Ну, к примеру, так

(ns dev.enums)

(def enums (atom {}))

(defn add-enum [name & items]
  (swap! enums assoc name (vec items)))

(defmacro defenum [name & items]
  `(apply add-enum '~name '~items))

(defn enum-value-index [enum-name enum-value]
  (if-let [enum (get @enums enum-name)]
    (.indexOf enum enum-value)
    -1))
;; (re)defining enums and retrieving values

(defenum my-enum one two three)
(println (enum-value-index 'my-enum 'one))

(defenum my-enum two three one)
(println (enum-value-index 'my-enum 'one))

;; no such enum
(println (enum-value-index 'no-such-enum 'one))
;; no such name
(println (enum-value-index 'my-enum 'no-such-name))

@enums
0
2
-1
-1

Драгоценного всёвавремякампиляцыи, там, наверное, нет — но работать будет, и работать будет одинаково, AOT или не AOT. Я думаю, этого достаточно %)