V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abersheeran
V2EX  ›  程序员

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

  •  
  •   abersheeran ·
    abersheeran · 2021-05-17 00:28:28 +08:00 · 3087 次点击
    这是一个创建于 1046 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    "hello world" |> print
    

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

    • lambda 的便捷写法: x -> x * x
    • partial 的便捷写法: pow(?, 2)
    • ES 的解构语法: a, b = obj or dict

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

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

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


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


    @wellsc 哈哈哈,这个语言真没看过。
    no1xsyzy
        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"
    abersheeran
        7
    abersheeran  
    OP
       2021-05-17 09:30:39 +08:00
    @no1xsyzy 酷,但我也没看过这个 rash,这个语法主要抄的 F#,连运算符优先级都是抄的 F#。
    wellsc
        8
    wellsc  
       2021-05-17 09:37:55 +08:00
    @no1xsyzy 那 bash 也可以
    no1xsyzy
        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(*?)
    abersheeran
        10
    abersheeran  
    OP
       2021-05-17 12:52:44 +08:00
    @no1xsyzy 我更喜欢你这个设计 func(*?),但是 func(?) 编译到什么 Python 代码,我暂时还没什么好的思路。
    wellsc
        11
    wellsc  
       2021-05-17 13:06:45 +08:00 via iPhone
    @no1xsyzy 我看过 sicp htdp,后面的不用和我解释😂,rash 倒是第一次听说
    wellsc
        12
    wellsc  
       2021-05-17 13:08:07 +08:00 via iPhone
    @abersheeran 有类似 type function 的东西吧,从 metaclass 入手
    no1xsyzy
        13
    no1xsyzy  
       2021-05-17 13:28:49 +08:00
    @wellsc (我只是又想黑黑王垠了
    racket 社区喜欢造新语言,还有 #lang video 呢( https://lang.video

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

    果然发出来给大家看看还是有好处的。😀
    abersheeran
        15
    abersheeran  
    OP
       2021-05-17 14:04:20 +08:00
    @no1xsyzy https://github.com/abersheeran/mingshe/issues/2 设计完了,感谢老哥给的建议,我一下就想明白了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3017 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 14:41 · PVG 22:41 · LAX 07:41 · JFK 10:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.