(defn string-to-string [s1]
{:pre [(string? s1)]
:post [(string? %)]}
s1)
Run Code Online (Sandbox Code Playgroud)
我喜欢:pre和:post条件,它们允许我弄清楚我何时更快地将"方形钉子放在圆孔中".也许这是错误的,但我喜欢将它们用作一种可怜的勒芒式检查器.这不是哲学,这是一个简单的问题.
在上面的代码中我似乎很容易确定这s1是:pre条件中的函数参数.类似地,%在:post条件总是函数返回值.
我想是打印的值s1或者%当任的这些相应的条件Asse田内失效.所以我得到了类似的东西
(string-to-string 23)
AssertionError Assert failed: (string? s1)
(pr-str s1) => 23
Run Code Online (Sandbox Code Playgroud)
AssertionError包含每个变量的单行,该变量被识别为来自函数参数列表并且在失败测试中被引用.当函数的返回值未通过:post条件时,我也想要类似的东西.
这将使得在尝试从AssertionError进行诊断时快速发现我滥用函数的方式变得微不足道.它至少会让我知道值是否nil是实际值(这是我犯的最常见的错误).
我有一些想法,这可能与宏来完成,但我想知道如果有办法基本上只是重新定义了任何安全和全球性的方式(defn和(fn朋友们这样做是:pre和:post也将打印导致测试值(S)失败.
我正在尝试为Clojurescript设置一个环境.我遇到的问题是不知道如何设置它以便我可以从emacs连接到Clojurescript Browser REPL,因此我可以直接从编辑器评估表单并将其显示在浏览器中.
我试过的事情:
我尝试使用Cemerick的piggieback并搭载nREPL.我真的不知道如何从文档中配置它.在弄清楚我必须在项目文件夹的根目录中创建一个index.html文件后,我才能使它工作.除了服务器不提供我的资产.
我尝试使用Clojurescript wiki中的bash脚本设置inferior-lisp.但是,每当我尝试运行劣质lisp程序时,我都会遇到"错误的类型参数:stringp,nil".
这是我理想的工作流程:
我有一个项目文件夹/ resources/public文件夹,其中包含我的资产和html文件.我可以通过响铃或使用python的简单http服务器启动一个以某种方式提供这些文件的Web服务器.我可以从emacs连接到REPL并将表单评估到其中.
我只是尝试使用ClojureScript,首先将我在Clojure中编写的内容转换为cljx.
当我尝试编译它时,我得到:
clojure.lang.ExceptionInfo: :refer must be followed by a sequence of symbols in :require
Run Code Online (Sandbox Code Playgroud)
我在网上找到了一些倾斜的参考文献,但是在哪里说明我是否应该能够:refer :all在ClojureScript程序中使用它.
如果我不能这样做,这个限制的原因是什么?
我正在尝试将ClojureScript用于项目.要成为一个快乐的开发人员,我需要一个快速的反馈循环:编写一些代码并尽快看到它.我也喜欢在当前页面的上下文中使用REPL.
我正在使用lein-cljsbuild和从我遇到的问题我认为我没有正确设置它.
首先,即使在"JWM热身"之后,小文件的编译时间也太大了:optimizations :simple:
Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Successfully compiled "resources/public/js/cljs.js" in 8.233018 seconds.
Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Successfully compiled "resources/public/js/cljs.js" in 5.522989 seconds.
Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Successfully compiled "resources/public/js/cljs.js" in 8.144354 seconds.
Run Code Online (Sandbox Code Playgroud)
其次,我不时会得到这样的东西:
Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Compiling "resources/public/js/cljs.js" failed.
Exception in thread "main" java.lang.NullPointerException
at java.util.regex.Matcher.getTextLength(Matcher.java:1140)
at java.util.regex.Matcher.reset(Matcher.java:291)
at java.util.regex.Matcher.<init>(Matcher.java:211)
at java.util.regex.Pattern.matcher(Pattern.java:888)
at clj_stacktrace.utils$re_gsub.invoke(utils.clj:6)
# ... many similar useless lines
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)
Run Code Online (Sandbox Code Playgroud)
这些堆栈跟踪(大部分时间与语法错误有关,正如我从实验中所理解的那样)比没有帮助更糟糕:它们不仅提供关于错误的零线索,还停止自动重新编译.在每次这样的堆栈跟踪之后,我应该做这些事情:
Cmd-C的shelllein cljsbuild auto这是一个很棒的项目,但从哪里开始?
我想为自己的项目制作自己的github fork.或者为每个项目"内部"创建一个分支.
也许我还没有真正理解这种社交编码的东西 - 但我真的感觉到我对"封装"或"封装"软件框架和开发环境的过敏.
是否应该在源文件中创建一个项目,坐在one.sample应用程序旁边?有很多目录我不知道从哪里开始.难道大多数One项目都不应该坐在clojars中供我们使用并吐出我们自己的应用模板,有点像lein noir new <appname>吗?
任何和所有见解表示赞赏,谢谢!
我有一些clojurescript,我想与一些JavaScript库互操作.在我的clojurescript代码中,我做了一些分析,并提出了一个地图列表.就像是
[{:prop1 "value1" :prop2 "value2"}, {:prop1 "something else" :prop2 "etc"}...]
Run Code Online (Sandbox Code Playgroud)
我需要将它传递给javascript函数as
[{prop1: "value1", prop2: "value2}, {..} ...]
Run Code Online (Sandbox Code Playgroud)
我不知道如何从我的clojurescript函数返回一个javascript对象.有没有办法将嵌套的地图和列表序列化为javascript对象.或者一种创建新javascript对象然后在其上设置属性的方法?
在我的通信层中,我需要能够捕获任何javascript异常,将其记录下来并像往常一样继续.在Clojurescript中捕获异常的当前语法规定我需要指定被捕获的异常的类型.
我试图在catch表单中使用nil,js/Error,js/object,它没有捕获任何javascript异常(可以将字符串作为对象的类型).
我很感激任何提示如何在Clojurescript中本地完成.
假设我想在我的客户端*.cljs和我的服务器端*.clj之间分解一些常见代码,例如各种数据结构和常见操作,我可以这样做吗?这样做有意义吗?
我想用clojurescript来编写chrome扩展.
clojure google-closure google-chrome-extension clojurescript
我已经看过使用Om进行富客户端网站设计.这也是我第一次使用core.async.阅读教程https://github.com/swannodette/om/wiki/Basic-Tutorial我已经看到使用core.async通道来处理删除操作(而不是在处理程序中完成所有工作).我的印象是,仅使用该通道进行删除是因为删除回调是在一个范围内声明的,在该范围内,您有一个项目级别的光标,您实际上想要操纵包含该项目的列表.
为了更深入地了解渠道,我看到了Rich Hickey的讲座http://www.infoq.com/presentations/clojure-core-async,他解释了如何利用渠道从事件回调中获取应用程序逻辑.这让我想知道教程中删除通道的实际目的是否显示构建应用程序的方式.如果是这样,
什么是与该模式相关的最佳实践?
是否应该为各种活动创建个人频道?即如果我添加一个控制器来创建一个新事件,我是否还会为对象创建创建一个新的通道,然后用于将对象添加到应用程序中另一个位置的全局状态?
让我们说我有一个项目列表,一个项目有一个详细/简洁的状态标志.如果detailed?是true,将显示更多的信息,如果detailed?是false它会显示较少的信息.我关联了一个在om/transact!游标上使用的点击事件(作为全局状态对象中列表项的视图).
(let [toggle-detail-handler
(fn [e]
(om/transact! (get-in myitem [:state])
#(conj % {:detailed? (not (:detailed? %))})))]
(html [:li {:on-click toggle-detail-handler}
"..." ]))
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是一个非常简洁的代码片段,其中使用渠道为手段,以分离从acutal逻辑变化的回调事件的整体利益呢起初似乎不值得,但更复杂的例子总体效益大于这个.但另一方面,为这种细节引入额外的通道 - 不详细的切换似乎也为源代码增加了相当大的负载.
如果你能对整个设计问题给出一些提示/提示或其他想法并将它们放到透视中,那就太好了.我觉得那里有点失落.