Skip to content

Latest commit

 

History

History
150 lines (119 loc) · 4.4 KB

README.md

File metadata and controls

150 lines (119 loc) · 4.4 KB

Lisptribe

这是一个基于开源项目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函数

安装

  1. 使用git将本项目克隆到本地
git clone [email protected]:guyuedumingx/lisptribe.git
  1. 运行想要运行的lisptribe客户端

python

cd python
python main.py

js

cd js
node main.py

powershell

cd powershell
powershell main.py
  1. 可选择性运行中心服务器
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)

表示在loaclhost1234端口跑起一个服务器,可向其他lisptribe解释器提供RPC服务

在项目中集成Lisptribe

python

  1. 复制python文件夹下的interpreter文件夹到你的项目中
  2. 使用以下代码导入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函数在本地控制台打开lisptriberepl

js

var interpreter = require("./interpreter/stepA_mal");

interpreter.rep("(load-file \"../init.mal\")") //加载init.mal文件
interpreter.repl()

中心服务器(CentralServer)

实现反向代理机制,用户在发送远程RPC请求时无需向具体的解释器发起调用,只需向中心服务器请求,由中心服务器分发RPC请求,经具体服务器执行后将结果返回给客户端

  1. 进入CentralServer文件夹
cd CentralServer
  1. 打开CentralServer/init.mal配置各服务器地址
(def! servers-map (hash-map
  'python '(localhost 1235)
  'js '(localhost 1236)
  'powershell '(localhost 1237)))

这段代码表示python服务器跑在1235端口...

  1. 运行服务器
python main.py
  1. 在客户端请求中心服务器
;;假设中心服务器运行在 localhost 1234端口
(def! remote '(localhost 1234))
(use remote (powershell* "notepad"))

如果本地把powershell服务器跑起来了,那么上面的代码将会打开电脑的记事本

相关项目

mal

贡献

欢迎