关于发送代码到 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 环境执行的细节》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

HTML Dog

HTML Dog

Patrick Griffiths / New Riders Press / 2006-11-22 / USD 49.99

For readers who want to design Web pages that load quickly, are easy to update, accessible to all, work on all browsers and can be quickly adapted to different media, this comprehensive guide represen......一起来看看 《HTML Dog》 这本书的介绍吧!

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

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试