1

编辑:已解决我的问题来自两件事——我在某处的 defmacro 中有语法错误。我删除了它并编写了一个我可以访问的小函数(仅在重新启动 repl 后)。第二个大问题是我不知道需要重新启动 repl 以识别我所做的任何更改。如果没有下面给出的具体答案,永远不会明白这一点=)。

我一直在研究 github 上的基座教程,它建议通过 repl 测试一些东西 - 我的问题是我找不到我感兴趣的命名空间/宏或函数。

user=> (require '(junkyard-client.html-templates))
nil
user=> (def t (junkyard-client-templates))

user=> CompilerException java.lang.RuntimeException: Unable to resolve symbol: 
  junkyard-client-templates in this context, compiling:
  (C:\Users\Ben\AppData\Local\Temp\form-init3290053673397861360.clj:1:8)

我在语法上尝试了其他东西,例如(需要'junkyard-client.html-templates)。这是基座教程中的 v2.0.10:https ://github.com/pedestal/app-tutorial/wiki/Slicing-Templates

编辑:这就是我想要达到的

(ns junkyard-client.html-templates
  (:use [io.pedestal.app.templates :only [tfn dtfn tnodes]]))

(defmacro junkyard-client-templates
  []
  {:junkyard-client-page (dtfn (tnodes "junkyard-client.html" "hello") #{:id})
   :other-counter (dtfn (tnodes "tutorial-client.html" "other-counter") #{:id}
  })

问题阶段 https://github.com/Sammons/clojure-projects/tree/d9e0b4f6063006359bf34a419deb31a879c7a211/pedestal-app-tutorial/junkyard-client

解决阶段

4

1 回答 1

1

require使命名空间在您当前的命名空间中可用,但不使符号直接可用。您仍然需要命名空间限定符号,除非您使用:referor use

(require '[junkyard-client.html-templates])

(def t (junkyard-client.html-templates/junkyard-client-templates))

为方便起见,最好为命名空间命名或引用您正在使用的特定符号。

别名:

(require '[junkyard-client.html-templates :as templates])

(def t (templates/junkyard-client-templates))

参考:

(require '[junkyard-client.html-templates :refer [junkyard-client-templates]])

(def t (junkyard-client-templates))

注意: require and:refer通常比use.

于 2013-10-07T20:23:03.137 回答