迫于 Guido 不懂 Python ,我写了一个 Python 超集

2021-05-17 00:28:28 +08:00
 abersheeran

标题前一部分是开玩笑的。但写了个 Python 超集是真的。https://github.com/abersheeran/mingshe

目前仅扩展了一个语法,就是 |> 和 ||> 。如果你写过 F#,那么应该很熟悉。如果你写过 Shell 那应该也不难理解。这就是管道运算符。

国际惯例,先 pip install mingshe --user 安装一下。当然,更推荐用 pipx

建个 helloworld.ms 文件,写入以下内容再运行 mingshe helloworld.ms 就行了

"hello world" |> print

下一步的计划大概是实现以下,欢迎 PR (我短时间内肯定写不完,毕竟编译原理这门课我是低分过的):

灵感来自于这个主题 https://v2ex.com/t/776613

3124 次点击
所在节点    程序员
15 条回复
Ultraman
2021-05-17 00:32:56 +08:00
我在写 Python vs 大佬在写 Python🌚
Contextualist
2021-05-17 01:25:48 +08:00
很高兴能给你带来启发。如果对函数式魔改 Python 感兴趣的话,可以看看红姐( thautwarm )的东西。另外好奇这个项目名字的含义?

粗略看了一下,想问一下为什么要为了解包额外定义运算符 ||> ,而不利用 Python 自己的解包语法呢?比如你测试里的 (1, 11) ||> range 是不是可以写成 *(1, 11) |> range ?
MicroBotter
2021-05-17 04:46:50 +08:00
你明显已经在很短的时间,改了好几次名字+换仓库了。这种不可靠库,根本没有人会去用。
wellsc
2021-05-17 09:12:40 +08:00
明明是借鉴了 Elixir 的 pipeline ( doge
abersheeran
2021-05-17 09:24:07 +08:00
@MicroBotter ?你好有自信。我清理 git history 是因为初版之前的代码记录没啥意义。至于改好几次名字+换仓库,你想多了,我只是没写完之前用的 private,写完之后转到 public 。你知道想个无重复+有含义的名字有多难吗,我换名字,我脑子坏了才换名字。


@Contextualist 古有鸣蛇,蛇身而四翼,其音如磐。||> 这个主要是看 F# 有,我也需要这个功能就写了,当时倒是没想到 *(a, b) |> range 就行😂


@wellsc 哈哈哈,这个语言真没看过。
no1xsyzy
2021-05-17 09:29:10 +08:00
话说
rash 里面 ||> 表示将一个 port (相当于 IOBase )转化成 string 操作
(注意,rash 里是可以直接嵌入命令行的)
比如 ls ||> string-split "\n" 相当于 ls |> port->string |> string-split "\n"
abersheeran
2021-05-17 09:30:39 +08:00
@no1xsyzy 酷,但我也没看过这个 rash,这个语法主要抄的 F#,连运算符优先级都是抄的 F#。
wellsc
2021-05-17 09:37:55 +08:00
@no1xsyzy 那 bash 也可以
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(*?)
abersheeran
2021-05-17 12:52:44 +08:00
@no1xsyzy 我更喜欢你这个设计 func(*?),但是 func(?) 编译到什么 Python 代码,我暂时还没什么好的思路。
wellsc
2021-05-17 13:06:45 +08:00
@no1xsyzy 我看过 sicp htdp,后面的不用和我解释😂,rash 倒是第一次听说
wellsc
2021-05-17 13:08:07 +08:00
@abersheeran 有类似 type function 的东西吧,从 metaclass 入手
no1xsyzy
2021-05-17 13:28:49 +08:00
@wellsc (我只是又想黑黑王垠了
racket 社区喜欢造新语言,还有 #lang video 呢( https://lang.video

@abersheeran 当然是 lambda _: func(*_) 咯
或者把 func(*?) 编译成上次那个库的 FF(func)
abersheeran
2021-05-17 13:33:32 +08:00
@no1xsyzy 好主意。我先把 ? 实现了,|> f(*?) 就能自然实现了。

果然发出来给大家看看还是有好处的。😀
abersheeran
2021-05-17 14:04:20 +08:00
@no1xsyzy https://github.com/abersheeran/mingshe/issues/2 设计完了,感谢老哥给的建议,我一下就想明白了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/777312

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX