узнать о типе параметров функции - PullRequest
0 голосов
/ 22 сентября 2010

Могу ли я как-то найти все функции / макросы, которые принимают параметры определенного типа?

например, какая функция принимает объект пространства имен в качестве параметра?

(это потому, что я могу создать пространство имен и сохранить его в var, но я не знаю, где я мог бы использовать этот var; в какую функцию я мог бы передать этот var?)

вот код:

user=> (def working-namespace (create-ns 'my-namespace))
#'user/working-namespace
;i created a namspace and want to use it later

user=> (class working-namespace)
clojure.lang.Namespace
; out of curiosity i found out that "working-namespace" is a Namespace object

user=> (ns working-namespace)
nil
working-namespace=>
; but how do i switch to it ? this didn't do what i wanted...

user=> (refer working-namespace)
java.lang.ClassCastException: clojure.lang.Namespace cannot be cast to clojure.lang.Symbol (NO_SOURCE_FILE:0)
; this did not work either as my expectations

user=> (the-ns working-namespace)
#<Namespace my-namespace>
user=> (class (the-ns working-namespace))
clojure.lang.Namespace
; great, this gave me the same thing, a Namespace

Отсюда возникает вопрос: как мне использовать его динамически (вот почему я поместил свое пространство имен в переменную)? как мне получить что-то полезное для меня из переменной, указывающей на пространство имен?

Я могу попробовать поискать функции, которые используют объект пространства имен или преобразуют его во что-то еще. Я сделал и нашел только "стажер". поиск вручную не кажется многообещающим

что, если у меня эта проблема будет миллион раз? Есть ли автоматический способ получить мне то, что я ищу, без необходимости каждый раз спрашивать?

Ответы [ 4 ]

4 голосов
/ 22 сентября 2010

В Clojure 1.2 и предыдущих аргументах функции нет типов. каждый аргумент функции является объектом . Поэтому на самом деле возникает вопрос: «Как мне найти функции, которые приведут объект, который я передаю, к этому типу?», Поэтому поиск подсказок по типу найдет некоторые из них, хотя это не даст вам ничего. в общем.

начиная с версии 1.3 (текущая ветвь разработчика 9/2010), параметры функции и возвращаемые типы могут иметь определенный тип и будут передаваться / возвращаться как этот тип, а не приводиться к объекту, а затем приводятся на другой стороне. Это отбрасывает один из нулей из времени выполнения числовых функций с важным ограничением, что оно работает только для: статических функций и только с прямыми вызовами (то есть: не с помощью map / lower / filter / etc.) Пока что об этом изменении опубликовано не так много, хотя в нем есть важное критическое изменение: целые числа больше не упаковываются по умолчанию, а переполнение целых чисел (фактически длинных) вызывает исключение. Вы можете прочитать больше здесь

(defn ^:static fib ^long [^long n]
  (if (<= n 1)
    1
    (+ (fib (dec n)) (fib (- n 2)))))

поэтому после того, как 1.3 будет выпущен и получит широкое распространение, вы увидите код с более часто определяемыми типами, потому что они обеспечат большую выгоду в скорости, и тогда вы сможете найти больше функций по типу аргумента, хотя еще не все из них.

На той же лекции, где я узнал о типах аргументов функции, Рич упомянул о планах в отдаленном будущем Clojure (после 'Clojure in Clojure') о лучшей поддержке для раскрытия внутренних частей компилятора инструментам, таким как IDE. Поэтому есть надежда, что когда-нибудь вы получите реальный ответ на этот вопрос. Динамические языки делают это немного сложнее на практике и намного сложнее в теории.

2 голосов
/ 23 сентября 2010

Вы уже получили хороший ответ от Артура, поэтому я отвечу только на вопрос «как мне получить что-то полезное для меня из переменной, указывающей на пространство имен?». Начиная с (doc ns), обратите внимание, что там написано без оценки :

user=> (doc ns)
-------------------------
clojure.core/ns
([name docstring? attr-map? references*])
Macro
  Sets *ns* to the namespace named by name (unevaluated), creating it

Теперь есть кое-что, что вы можете сделать с in-ns, если хотите (весь объект пространства имен -> строка -> преобразование символов, вероятно, глупо, но достаточно, чтобы проиллюстрировать мою точку зрения):

user=> (in-ns (symbol (str working-namespace)))
#<Namespace my-namespace>
my-namespace=>
0 голосов
/ 23 сентября 2010

Вы писали:

user=> (ns working-namespace)
nil
working-namespace=>
; but how do i switch to it ? this didn't do what i wanted...

Но вы действительно переключились на пространство имен working-namespace (поэтому подсказка изменилась), поэтому мне не ясно, что "вы хотели".

Как я отмечал ранее, вам необходимо представить конечную проблему, которую вы пытаетесь решить. Вполне вероятно, что возиться с объектами пространства имен не будет решением.

0 голосов
/ 22 сентября 2010

Я не думаю, что вы можете сделать это без большого количества хакерских атак на динамическом языке. Если вы хотите узнать, какие функции занимают пространства имен, посмотрите документацию по пространству имен.

Например, очистка пространств имен или перезагрузка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...