关于发送代码到 shadow-cljs 环境执行的细节

栏目: 编程语言 · Clojure · 发布时间: 6年前

内容简介:聊天记录长的我都记不住了, 写博客...起因是看到了网上有人写 Clojure 然后用快捷键直接执行代码,感觉还是蛮舒服的, 特别是用来教学的时候, 或者试验一些功能的时候,

聊天记录长的我都记不住了, 写博客...

起因是看到了网上有人写 Clojure 然后用快捷键直接执行代码,

感觉还是蛮舒服的, 特别是用来教学的时候, 或者试验一些功能的时候,

因为直接在 REPL 里写肯定是很累的, 但是写在编辑器是文件, 不好单独执行,

而执行某一段选中的代码, 应该是不错的办法.

Lisp 跟 Smalltalk 都搞过...

首先, Clojure 是提供了一个功能的, nREPL, 可以通过网络发送代码到一个 REPL,

然后在这个 REPL 里执行代码, 得到执行的输出结果, 或者执行的报错.

现在已经知道的有两种实现, nREPL 和 Socket REPL, 有一些区别,

https://stackoverflow.com/que...

nREPL 是社区里做了比较久的一个工具, 而 Socket REPL 是官方临时加的一个小功能,

此外还有 unrepl 是一个新的东西, 还不熟悉. 以及一个不知道啥情况的 prepl.

由于我的代码是要在 shadow-cljs 连接的浏览器运行的, 所以整个都要围绕 shadow-cljs 搞.

nREPL

shadow-cljs 是支持的 nREPL 的:

https://shadow-cljs.github.io...

按照文档配置好之后, nREPL 的 server 就启动了.

具体的内容是用 bencode 编码的, 感觉挺邪乎, 还是 BitTorrent 用的协议,

昨天在群里问的时候, 推荐我用 node 类库来搞这个事情:

https://github.com/rksm/node-...

捣腾了一下, 比如端口是 9000 的话, 可以这样发送代码过去:

n = require 'nrepl-client'
c = n.connect port: 9000

show = (err, result) -> console.error 'Error:', err; console.log 'Result', result

c.eval '(println "code")', show
c.eval '(+ 33 44)', show

然后代码就会在后台执行... 从 shadow-cljs 看不到 log, 但是从 API 能拿到返回的 output.

返回的 output 是挺让人崩溃的, 是一个 Vector, 包含几个 Map.

中间会带着一些 id, 以及返回的内容, 结构有点乱. 我手头没有留记录.

Socket REPL

Socket REPL 只是纯文本格式的发送 code, 返回执行结果,

shadow-cljs 的运行端口在 target/shadow-cljs/socket-repl.port 文件可以拿到,

或者通过配置文件去设置:

:socket-repl {:port 123}

同时有个私有的去掉 prompt 版本的 Socket REPL, 端口在 target/shadow-cljs/cli-repl.port .

说是内部使用的, 端口随机, 不建议使用, 那样我也尽量不去用吧...

连接 Socket REPL 用 TCP 协议直接就好, 参考 Node API 文档:

https://nodejs.org/api/net.ht...
net = require 'net'
c = net.createConnection port: 51053

c.on 'data', (data) -> console.log data.toString()

c.write '(println 1)\r\n'

返回的 output 就是一般的 REPL 运行的 log, 真的很一般, prompt 对开发 工具 很不友好.

这个代码的运行环境是 shadow-cljs 编译器自己的进程, 不是我的代码运行的环境,

thheller 说如果要进一步切换到浏览器用的执行环境, 还需要再调用 API:

c.write '(shadow.cljs.devtools.cli/from-remote "some-uuid" "another-uuid" ["cljs-repl" "browser"])'

这里的 uuid 似乎是随意的. 然后 "browser" 是我的任务的 build-id.

from-remote 在源码当中大概是这样, 反正我只能看个大概了...

https://github.com/thheller/s...

然后再发送代码, 在浏览器就有反应了, 可以看到 log:

c.write '(println 4444)\n'

总之基于这个原理, 我应该是能在 Calcit Editor 当中实现我想要的功能了.

unrepl

下午刚搜到过, Slack 上也只是刚认到人, 还不知道什么情况,

大致的印象是一个新的加 REPL 的方案, 基于 Lumo 做的, 启动很快,

但是还要再问一下具体能做什么...

https://github.com/Unrepl/unrepl

https://www.youtube.com/watch...

prepl

这个奇怪的东西还是 thheller 在 Slack 上说到的, 前几天的 commit 里出现的:

https://github.com/clojure/cl...

现在还不知道是干啥的.

小结

后面还要在刷一下文档然后在 Calcit Editor 里加上对应的功能.

晚点再说了... 估计接下来会有一些新闻, 到时候再更新了.


以上所述就是小编给大家介绍的《关于发送代码到 shadow-cljs 环境执行的细节》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

一网打尽

一网打尽

[美]布拉德·斯通 / 李晶、李静 / 中信出版社 / 2014-1-15 / 49.00元

亚马逊最早起步于通过邮购来经营图书业务。但贝佐斯却不满足于仅做一名书商,他希望缔造亚马逊万货商店的神话——能提供海量的货源,并以超低的价格提供最具吸引力的便捷服务。为了实现这一诺言,他发展了一种企业文化,这种文化蕴含着执着的雄心与难以破解 的秘诀。亚马逊的这 一文化现在依旧在发扬光大。 布拉德·斯通非常幸运地得到采访亚马逊的前任和现任高管、员工以及贝佐斯本人、家人的机会,使我们第一次有机会深......一起来看看 《一网打尽》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具