从.cljc到.clj调用的值始终为null

时间:2017-11-04 18:25:33

标签: clojure clojurescript

我的common.cljc文件如下所示:

   (ns example.common
     #?(:cljs
    (:require [goog.dom :as gdom])
       )
    )

    #?(:cljs (enable-console-print!))

   (defn mobile? []
        #?(:cljs (def hvpsize (.. (gdom/getViewportSize) -height))) 
        #?(:cljs (def wvpsize (.. (gdom/getViewportSize) -width))) 
        #?(:cljs (if (<= (/ wvpsize hvpsize) 1) true false))
   )

   (def mobile-value (mobile?))

   (println "mobile-value inside .cljc")
   (println mobile-value)

我的routes.clj文件如下所示:

     (ns example.routes 
        (:gen-class)
        (:use compojure.core
               example.views
               example.common
               [hiccup.middleware :only (wrap-base-url)])
        )

        (use '[ring.util.response :only [response]])
        (use '[ring.adapter.jetty :only [run-jetty]])
        (require '[compojure.route :as route])

        (defn -main
          "I don't do a whole lot ... yet."
          [& args]
          (println "Hello, World!"))

        (defn d-or-m-version [] 
           (.println System/out "Inside d-or-m-version")
           (.println System/out mobile-value)
           (if mobile-value (root-page-mobile) (root-page-desktop))
           )

        (defroutes main-routes 
           (GET "/" [] (d-or-m-version))
           (route/not-found "404"))

        (defonce server (run-jetty #'main-routes {:port 8080 :join? false}))

mobile-value在重新加载.cljc文件中的页面时,甚至在我单独的.cljs文件中正确评估。

问题是在routes.clj中评估mobile-value时它只返回null。因此d-or-v-version中的if语句不会从单独的views.clj文件中调用正确的hiccup html。

我假设mobile-value返回null,因为routes.clj在common.cljc之前运行,而mobile-value没有值。但是,我不知道如何解决这个问题,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

从Clojure调用时,它评估为nil,因为它在Clojure中是一个空函数。 #?(:cljs reader条件告诉Clojure编译器忽略这个表单,因为它应该仅由Clojurescript编译器进行评估。

由于Clojure编译器中不存在该函数中的所有表单,因此该函数为空,并且它将始终求值为nil