如何在deps.edn中设置*print-length*的默认值?
嘿,我刚好折腾过这个问题!在deps.edn里设置*print-length*的默认值有两种实用的方式,我给你详细拆解下:
在deps.edn中设置
*print-length*默认值的方法 方法1:通过JVM系统属性快速配置
Clojure从1.9版本开始支持通过系统属性自动初始化打印相关的Var,这是最省心的方式。你只需要在deps.edn的:jvm-opts里添加对应的参数:
{:deps {org.clojure/clojure {:mvn/version "1.11.1"}} :jvm-opts ["-Dclojure.print.length=10"]}
这样每次用clj启动REPL或者运行项目代码时,*print-length*都会被自动设为10。要是你还想限制嵌套数据的打印层级,可以再加个"-Dclojure.print.level=3"的参数。
方法2:自定义启动代码实现灵活初始化
如果需要同时配置多个打印Var,或者要执行其他初始化逻辑(比如加载配置、设置全局变量),可以用:main-opts指定启动时先跑一段Clojure代码:
场景1:启动标准REPL
{:deps {org.clojure/clojure {:mvn/version "1.11.1"}} :main-opts ["-e" "(do (set! *print-length* 10) (set! *print-level* 3))" "-m" "clojure.main"]}
这里-e参数会先执行初始化代码,随后-m clojure.main启动标准REPL。
场景2:启动自定义主命名空间
如果你的项目有自己的主入口(比如my.app.core),可以把初始化代码放在启动命令的前面:
{:deps {org.clojure/clojure {:mvn/version "1.11.1"}} :main-opts ["-e" "(set! *print-length* 10)" "-m" "my.app.core"]}
场景3:用专门的初始化文件
你也可以创建一个独立的初始化命名空间,比如my.app.init,把所有启动逻辑都写在里面:
(ns my.app.init) ;; 设置打印参数 (set! *print-length* 10) (set! *print-level* 3) ;; 其他初始化操作,比如加载全局配置
然后在deps.edn里指定先加载这个文件再启动REPL:
{:deps {org.clojure/clojure {:mvn/version "1.11.1"}} :main-opts ["-i" "src/my/app/init.clj" "-r"]}
-i负责加载初始化文件,-r启动REPL。
验证设置是否生效
启动REPL后,直接打印*print-length*就能确认:
*print-length* ;; => 10
或者打印一个长序列测试效果:
(range 20) ;; => (0 1 2 3 4 5 6 7 8 9 ...)
内容的提问来源于stack exchange,提问作者Mert Nuhoglu
相关产品推荐
相关产品推荐

