使用& # 39;eval # 39;ClojureScript中的特殊表单,用于确定表单是否为文字
Using 'eval' special form in ClojureScript to determine if a form is literal
我正在编写一个函数确定是否形式(例如(reverse [1 2 3])
) 是文字。为此,我有以下代码:
(defn literal? [form]
(let [evaluation (try
(eval form)
(catch Exception exception false))]
(if evaluation
(= evaluation form)
true)))
This尝试先计算表单;如果失败,则认为该形式为文字。
如果表单求值成功,则进一步检查求值是否等于表单本身。如果是这样,它就是字面意思。
该函数适用于。clj文件中的[1 2 3]
,但在。cljs文件中,我得到以下错误:
TypeError: Cannot read property 'call' of undefined
at eval (/home/peter/ide/src-cljs/ide/core.cljs[eval16]:71:14)
at eval (native)
at Function.<anonymous> (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:35236:461)
at b (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:6188:14)
at a (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:6234:18)
at cljs.core.do_dispatch (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:13583:26)
at cljs.core.MultiFn.cljs$core$IMultiFn$_dispatch$arity$2 (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:13655:32)
at cljs.core._dispatch (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:13568:14)
at a (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:13662:32)
at b [as call] (file:///opt/lighttable-0.8.1-linux/resources/app/core/node_modules/lighttable/bootstrap.js:13666:14)
有没有人有一个解决方案,将在ClojureScript工作?
提前感谢!
这是可能的,但这有点棘手!
如果你去clojurescript。输入这个神秘的咒语:
(js/cljs.js.eval (js/cljs.js.empty-state) [1 2 3] (fn [x] (prn "********" x)))
然后检查您的开发控制台,您将看到:
"********" {:value [1 2 3]}
与其他输出一起出现。
希望这能让你相信(a) eval是有效的!(b) eval在cljs中有点复杂。
你可能会问为什么所有的js都是互操作的?在正在执行的REPL上下文中,这些符号不在编译器的当前状态,因为javascript是在编译站点时创建的。有一些方法可以预加载状态,但需要一些工作来实现。不要担心,如果您将eval
作为程序的一部分(而不是从REPL)调用,那么这些都无关紧要。如果你在程序中使用eval,你可以这样写代码:
(ns ....... (:require .....
[cljs.js :refer [eval empty-state js-eval]]))
(eval (empty-state)
[1 2 3]
{:eval js-eval
:source-map true
:context :expr}
(fn [x] (prn "*****" x)))
产生同样的效果:
"*****" {:value [1 2 3]}
简而言之,您需要从cljs.js
引用eval
,并且它需要传递一些状态。
- http://clojurescript。查看构建此站点的代码
- 阅读Mike Fikes的博客!https://blog.fikesfarm.com/posts/2016-01-22-clojurescript-eval.html(和其他帖子)他编写了大部分引导代码,并在Planck中积极使用。
- https://yogthos.net/posts/2015-11-12-ClojureScript-Eval.html
- http://ctford.github。io/klangmeister/预加载状态的好参考。
相关文章:
- jQuery表单添加不适用于下拉列表
- Rails/JSON:如何将JSON用于jquery UI自动完成表单
- jQuery表单验证适用于Mozilla和Internet Explorer,但不适用于Chrome或Safari
- Mailchimp内联表单验证不适用于JS加载的HTML
- 需要一个用于AJAX的Javascript库,其中包含多部分/表单数据
- 如何将javascript仅应用于1个表单中的2个表单提交按钮中的1个
- 表单中用于特定字段的滚动条
- asp.net mvc中的javascript验证不适用于登录表单
- 通过 AJAX 发送表单,HTML 节点选择用于数据发送
- 通用 jQuery,用于在 HTML5 验证后禁用所有表单上的提交按钮
- JavaScript 表单验证不适用于所有 HTML 字段
- JavaScript函数不适用于我的HTML表单
- jQuery .submit() 不适用于 javascript 生成的 html 表单
- 用于处理表单的Handlerbars模板
- 缺少用于创建的模板.内部服务器错误-聚合物表单保存到数据库
- 临时存储用户表单数据的最佳方式,用于表单重新提交
- Angularjs 两个表单用于同一个控制器
- 一个源表单用于所有页面
- 动态CRM表单:用于虚拟的jScript
- Javascript内的PHP注册表单(用于验证)