Как я могу имитировать поведение «load-file» при использовании? - PullRequest
0 голосов
/ 21 октября 2011

Привет, ребята: я хочу увидеть все функции в моем пространстве имен, из repl (для быстрого взлома и тестирования).

Чем использование отличается от нагрузки?

Я заметил, что если я "загрузил файл" x, все импортные данные теперь находятся в моем пространстве имен (даже те, которые являются внешними по отношению к файлу).

ОДНАКО, если я "использую" x (ссылаясь на пространство имен x), импортируемые в x классы не доступны в реплее.

Есть ли способ, которым я могу воспользоваться, чтобы имитировать способ, которым загрузочный файл включает импорт файлов в мою реплику?

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Ну, не делай этого: P. Если вы хотите находиться в определенном пространстве имен, тогда вместо того, чтобы притворяться каким-то безумным use, чтобы импортировать все в user ns, почему бы просто не войти в это пространство имен? (require 'myns) (in-ns 'myns) делает это, или удобный ярлык (doto 'myns require in-ns).

1 голос
/ 22 октября 2011

специальные формы, такие как use, хорошо ... особенные.Вы не можете писать функции, которые «используют» пространства имен в вызывающих ns.Но простой макрос может спасти вас!

Я делал это в проекте еще до того, как leiningen правильно загрузил свой репл

(defmacro load-all []
  '(use 
   :reload-all
   'com.cryptovide.modmath
   'com.cryptovide.combine
   'com.cryptovide.split
   'com.cryptovide.encrypt
   'com.cryptovide.misc
   'com.cryptovide.decrypt
   'com.cryptovide.modmathTest
   'com.cryptovide.combineTest
   'com.cryptovide.splitTest
   'com.cryptovide.encryptTest
   'com.cryptovide.miscTest
   'com.cryptovide.decryptTest
   'com.cryptovide.testlib
   'com.cryptovide.gui
   'com.cryptovide.checksum
   'com.cryptovide.log))

Когда вы вызываете это, читатель запускает use es из пространства имен, в котором вы вызываете его (например, он use * превратит их в текущий репл ns

1 голос
/ 21 октября 2011

use импортирует все публичные переменные в текущее пространство имен.Разве это не то, что вы хотите?

Пример:

user> (use 'clojure.pprint)
nil
user> (pprint [:foo])
[:foo]
nil
...