История изменений
Исправление 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. Я думаю, этого достаточно %)