这是一个基于开源项目mal实现的跨语言RPC控制框架
支持使用一种语言调用python, js, bash, powershell等多种语言的库及自定义函数
本身是一种lisp方言,具有无限拓展性
在mal
不同平台解释器实现的基础上拓展解释器的功能, 增加Socket
编程,网络通信,实现在多个语言解释器之间的mal RPC
调用,通过load-lib
函数将各平台语言的native
函数暴露在mal
解释器中,实现mal
对原生语言的RPC
调用
(def! python '(localhost 1235))
(use python (global-symbols))
表示调用运行在localhost 1235
的python解释器并调用global-symbols
函数
- 使用
git
将本项目克隆到本地
git clone [email protected]:guyuedumingx/lisptribe.git
- 运行想要运行的lisptribe客户端
python
cd python
python main.py
js
cd js
node main.py
powershell
cd powershell
powershell main.py
- 可选择性运行中心服务器
cd CentralServer
python main.py
当客户端运行起来之后
Mal [python]
>>>
其中 [python]
表示当前的语言环境是python
可使用(global-symbols)
命令查看当前环境的所有指令
>>> (global-symbols)
(= throw nil? true? false? number? string? symbol symbol? keyword keyword? fn? macro? pr-str str prn println readline read-string slurp < <= > >= + - * / time-ms list list? vector vector? hash-map map? assoc dissoc get contains? keys vals sequential? cons concat vec nth first rest empty? count apply map conj seq with-meta meta atom atom? deref reset! swap! eval *ARGV* *host-language* not load-file cond send-msg server repl global-symbols-string exit load-lib type use use-to-mal pr-list dotimes bind-env new-env env-find env-find-str env-get env-set car cdr global remote global-symbols)
具体的关键字作用请查看mal语言解释器或参考lisp的其他实现
使用(load-file)
加载mal
文件
>>> (load-file "init.mal")
nil
使用(load-lib)
加载各具体平台的第三方依赖
如python平台:
>>> (load-lib "env.py")
会自动加载env.py
文件中的所有函数并映射到lisp中,可使用(global-symbols)
指令查看
使用use
use-for-mal
send-msg
进行远程RPC调用
use
use-for-mal
是在init.mal
中实现的,send-msg
是借助语言平台的socket编程实现的native
函数
>>> (use '(localhost `1234) (sqrt 2))
上面的指令表示调用远程(localhost 1234)
平台执行 (sqrt 2)
指令
使用server
指令在本地运行服务器
(server "localhost" 1234)
表示在loaclhost
的1234
端口跑起一个服务器,可向其他lisptribe解释器
提供RPC服务
python
- 复制
python
文件夹下的interpreter
文件夹到你的项目中 - 使用以下代码导入
lisptribe
python
import sys
sys.path.append("./interpreter")
import interpreter.stepA_mal as interpreter
interpreter.REP("(load-file \"../init.mal\")") #加载init.mal文件
interpreter.repl()
REP
函数表示解释字符串为lisp
指令, repl
函数在本地控制台打开lisptribe
的repl
js
var interpreter = require("./interpreter/stepA_mal");
interpreter.rep("(load-file \"../init.mal\")") //加载init.mal文件
interpreter.repl()
实现反向代理机制,用户在发送远程RPC请求时无需向具体的解释器发起调用,只需向中心服务器请求,由中心服务器分发RPC请求,经具体服务器执行后将结果返回给客户端
- 进入CentralServer文件夹
cd CentralServer
- 打开
CentralServer/init.mal
配置各服务器地址
(def! servers-map (hash-map
'python '(localhost 1235)
'js '(localhost 1236)
'powershell '(localhost 1237)))
这段代码表示python
服务器跑在1235
端口...
- 运行服务器
python main.py
- 在客户端请求中心服务器
;;假设中心服务器运行在 localhost 1234端口
(def! remote '(localhost 1234))
(use remote (powershell* "notepad"))
如果本地把powershell
服务器跑起来了,那么上面的代码将会打开电脑的记事本
欢迎