Вземете тип елементи в clojure на списък

Имам цитиран израз, напр.

(def foo '(+ 1 (bar)))

Искам да мога да намеря типа на всеки елемент от този списък, напр. да направя нещо подобно

(type (second foo))

Получавам различни резултати в зависимост от типа стойност, например следните и двете оценяват на java.lang.Double, което е, което бих искал

(type '3.0)
(type 3.0)

Още

(type '+)
(type +)

добиви съответно

clojure.lang.Symbol
clojure.core$_PLUS_

Мислех, че може би ключът за разрешаване ще помогне още

(type (resolve '+))

оценява на:

clojure.lang.Var


person zenna    schedule 11.02.2013    source източник
comment
Опа! Коригирано, все още стойността извън (тип (разреши '+)) е clojure.lang.Var. Как мога да стигна от това до clojure.core$_PLUS_   -  person zenna    schedule 11.02.2013


Отговори (2)


Има само символи '+, 'bar и самооценяващ се обект 1 (дълъг) във вашия списък

(= '(+ 1 (bar))
   (list '+ '1 (list 'bar)))
=> true

Използвайте eval.

(type (eval '+)) 
=> clojure.core$_PLUS_

И

(type '3.0) = (type 3.0) = (type (eval '3.0)) = java.lang.Double

защото числата са самооценяващи се обекти.

person mobyte    schedule 11.02.2013

Деименирайте разрешената Var:

(type (deref (resolve '+)))
person mtyaka    schedule 11.02.2013