用 C 写了一个 Racket 解释器,一个很小的功能子集 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
haozhang
V2EX    C

用 C 写了一个 Racket 解释器,一个很小的功能子集

  •  1
     
  •   haozhang 2019 年 9 月 15 日 6114 次点击
    这是一个创建于 2376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    常用的 form 都实现了,递归,闭包什么的,链接如下 https://github.com/Summerlve/Little-Racket

    31 条回复    2019-09-18 09:39:57 +08:00
    Rorshach
        1
    Rorshach  
       2019 年 9 月 15 日
    挺好的,先 star 以后学习
    haozhang
        2
    haozhang  
    OP
       2019 年 9 月 15 日
    我就看了一下 js 写的 the super tiny compiler,大致了解了 lexer,parser,就开干了= =,对于 eval 部分,完全靠自己想法子,没参考什么书,写的估计奇葩无比......
    haozhang
        3
    haozhang  
    OP
       2019 年 9 月 15 日
    favourstreet
        4
    favourstreet  
       2019 年 9 月 15 日
    这么多行……楼主的#include 还带上了"./"看着着实可爱,是什么编辑器或者 IDE 给添上的?
    haozhang
        5
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @favourstreet 带./有什么问题吗....表示下当前路径啊,我向来能省的一定写上去,看着多省力
    Mohanson
        6
    Mohanson  
       2019 年 9 月 16 日 via Android
    同分享下用 ts(typescript) 写的 ts 编译器: https://github.com/cryptape/minits
    rus4db
        7
    rus4db  
       2019 年 9 月 16 日 via Android
    诶嘿,我也在玩这个,欢迎切磋
    https://github.com/mikukonai/AuroraScheme
    haozhang
        8
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @mikukonai 66666
    haozhang
        9
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @mikukonai 我是直接 c runtime 里面去计算 racket 代码,我看了下你那个比我的高级多了
    missdeer
        10
    missdeer  
       2019 年 9 月 16 日
    @haozhang 杠一下,不带 “./”不是更省力吗
    guxingke
        11
    guxingke  
       2019 年 9 月 16 日
    推荐一个项目, build your own lisp interpreter

    https://github.com/kanaka/mal

    大部分语言的实现都有了
    haozhang
        12
    haozhang  
    OP
       2019 年 9 月 16 日
    @missdeer 写着省力了,看着费劲了,你还得脑子拐道弯才意识到这不是标准库头文件
    haozhang
        13
    haozhang  
    OP
       2019 年 9 月 16 日
    @guxingke 这不中,这项目明显用 racket 去实现 racket,而我这个是 c 实现 racket
    guxingke
        14
    guxingke  
       2019 年 9 月 16 日 via Android
    @haozhang 你这可没看仔细。。。 mal 可以自举 建议重新看一下
    haozhang
        15
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @guxingke 那么问题来了这个 racket 是用什么语言实现的,我没找到 c 代码啊?
    guxingke
        16
    guxingke  
       2019 年 9 月 16 日
    no1xsyzy
        17
    no1xsyzy  
       2019 年 9 月 16 日
    @haozhang #12 其实 C 语言习惯上来说 "" 就是非标准,<> 就是标准的和外部的……
    或者说 "" 优先当前目录找,<> 优先 lib 里面找,不清楚是标准还是实现,不是专精 C
    haozhang
        18
    haozhang  
    OP
       2019 年 9 月 16 日
    @guxingke 这个不是用不同的语言去实现 lisp,这和我将 c 实现 racket 有哪门子关系啊。。。。
    haozhang
        19
    haozhang  
    OP
       2019 年 9 月 16 日
    @guxingke 这个自举就看不懂了,我都没看出来他哪里自举了= =
    haozhang
        20
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @no1xsyzy 所以我加./更清晰....有啥子问题吗,你这个描述不还是来绕个弯子,我看见./就是我的代码不清楚?
    guxingke
        21
    guxingke  
       2019 年 9 月 16 日
    @haozhang mal 有个 mal 语言的实现. 可以说是自举(self-hosted) .
    guxingke
        22
    guxingke  
       2019 年 9 月 16 日
    @haozhang racket 是个 lisp 方言.
    mal 项目也是啊.
    haozhang
        23
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @guxingke 多好玩呢....我说着 c 实现 racket,你给我来一套 mal 语言他娘自举....
    haozhang
        24
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    @guxingke 你来套 racket 自举么好了,来个 mal 自举什么玩意....
    haozhang
        25
    haozhang  
    OP
       2019 年 9 月 16 日 via Android
    为啥老是有人回复点莫名其妙的东西的,说着用勺子吃西瓜,他非得来个有人种了片南瓜你去瞧瞧,西瓜南瓜都是瓜....
    shangh
        26
    shangh  
       2019 年 9 月 17 日
    shangh
        27
    shangh  
       2019 年 9 月 17 日
    厉害~
    no1xsyzy
        28
    no1xsyzy  
       2019 年 9 月 17 日
    @haozhang 小学语文:语义重复是语法错误
    不过也有 “一颗是枣树,另一颗也是枣树” 这种

    就像是你觉得没有 ./ “还得脑子拐道弯才意识到这不是标准库头文件”
    但也有人看到 ./ “还得脑子拐道弯才意识到这不是标准库头文件”
    我则是虽然一看就知道它不是标准库头文件,但还是会强迫症地想一遍 “这个东西是多余的” 并且再把 #include 语法从脑子里掏出来验证一遍,非常分散注意力。
    另外,我不清楚 #include <./somelib> 是什么行为…… 小心导致不一致
    haozhang
        29
    haozhang  
    OP
       2019 年 9 月 18 日 via Android
    @no1xsyzy 所以我哪里写了...<./xxx>了,你找出来我改
    no1xsyzy
        30
    no1xsyzy  
       2019 年 9 月 18 日
    @haozhang 我是说如果你哪天碰到一个别人写的 <./xxx>,结果你就当作是用户自定义库了,而实际上是找标准库的话会造成你读别人代码的混乱。
    另外,根据 C 语言标准, #include "" 和 #include <> 如何寻找都是实现者来决定的:典型地,VC 的标准库和 gcc 的标准库在根本不同的,也不具有可兼容地进行指示的位置。所以说有可能导致某些编译器根本不认 "./xxx",它根本不在本地目录找文件 "xxx" 而是在本地目录找文件 ".%2Fxxx" 结果找不到。
    haozhang
        31
    haozhang  
    OP
       2019 年 9 月 18 日 via Android
    @no1xsyzy 你说的对
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3277 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:39 PVG 20:39 LAX 05:39 JFK 08:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86