标题前一部分是开玩笑的。但写了个 Python 超集是真的。https://github.com/abersheeran/mingshe
目前仅扩展了一个语法,就是 |> 和 ||> 。如果你写过 F#,那么应该很熟悉。如果你写过 Shell 那应该也不难理解。这就是管道运算符。
国际惯例,先 pip install mingshe --user
安装一下。当然,更推荐用 pipx
。
建个 helloworld.ms
文件,写入以下内容再运行 mingshe helloworld.ms
就行了
"hello world" |> print
下一步的计划大概是实现以下,欢迎 PR (我短时间内肯定写不完,毕竟编译原理这门课我是低分过的):
x -> x * x
pow(?, 2)
a, b = obj or dict
灵感来自于这个主题 https://v2ex.com/t/776613
1
Ultraman 2021-05-17 00:32:56 +08:00 via Android 1
我在写 Python vs 大佬在写 Python🌚
|
2
Contextualist 2021-05-17 01:25:48 +08:00
很高兴能给你带来启发。如果对函数式魔改 Python 感兴趣的话,可以看看红姐( thautwarm )的东西。另外好奇这个项目名字的含义?
粗略看了一下,想问一下为什么要为了解包额外定义运算符 ||> ,而不利用 Python 自己的解包语法呢?比如你测试里的 (1, 11) ||> range 是不是可以写成 *(1, 11) |> range ? |
3
MicroBotter 2021-05-17 04:46:50 +08:00 1
你明显已经在很短的时间,改了好几次名字+换仓库了。这种不可靠库,根本没有人会去用。
|
4
wellsc 2021-05-17 09:12:40 +08:00
明明是借鉴了 Elixir 的 pipeline ( doge
|
5
abersheeran OP @MicroBotter ?你好有自信。我清理 git history 是因为初版之前的代码记录没啥意义。至于改好几次名字+换仓库,你想多了,我只是没写完之前用的 private,写完之后转到 public 。你知道想个无重复+有含义的名字有多难吗,我换名字,我脑子坏了才换名字。
@Contextualist 古有鸣蛇,蛇身而四翼,其音如磐。||> 这个主要是看 F# 有,我也需要这个功能就写了,当时倒是没想到 *(a, b) |> range 就行😂 @wellsc 哈哈哈,这个语言真没看过。 |
6
no1xsyzy 2021-05-17 09:29:10 +08:00
话说
rash 里面 ||> 表示将一个 port (相当于 IOBase )转化成 string 操作 (注意,rash 里是可以直接嵌入命令行的) 比如 ls ||> string-split "\n" 相当于 ls |> port->string |> string-split "\n" |
7
abersheeran OP @no1xsyzy 酷,但我也没看过这个 rash,这个语法主要抄的 F#,连运算符优先级都是抄的 F#。
|
9
no1xsyzy 2021-05-17 12:37:33 +08:00
@wellsc rash 不是 POSIX 兼容 Shell,在每行第一个 |> 之后是完全的 racket 代码。
Racket 的编译效率和运行效率很高(但几乎没人做 benchmark ),得益于王垠他老师的 ChezScheme 。 注:Racket 不是王垠做出来的 :) @abersheeran 我觉得存在解包应用( detuple-apply )的语法在函数式和流式语言都是显然的设计失误。 函数式可以非常容易地立即构造一个 tfunc (a,b) = func a b 至于流式处理为主的语言,更是应当采用双重流的处理方式。 至于你的语言,我看完全应当倾向写成 func(*?) |
10
abersheeran OP @no1xsyzy 我更喜欢你这个设计 func(*?),但是 func(?) 编译到什么 Python 代码,我暂时还没什么好的思路。
|
12
wellsc 2021-05-17 13:08:07 +08:00 via iPhone
@abersheeran 有类似 type function 的东西吧,从 metaclass 入手
|
13
no1xsyzy 2021-05-17 13:28:49 +08:00
@wellsc (我只是又想黑黑王垠了
racket 社区喜欢造新语言,还有 #lang video 呢( https://lang.video @abersheeran 当然是 lambda _: func(*_) 咯 或者把 func(*?) 编译成上次那个库的 FF(func) |
14
abersheeran OP |
15
abersheeran OP @no1xsyzy https://github.com/abersheeran/mingshe/issues/2 设计完了,感谢老哥给的建议,我一下就想明白了。
|