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

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

  •  1
     
  •   haozhang · 2019-09-15 22:29:26 +08:00 · 5457 次点击
    这是一个创建于 1887 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    https://github.com/kanaka/mal

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

    就像是你觉得没有 ./ “还得脑子拐道弯才意识到这不是标准库头文件”
    但也有人看到 ./ “还得脑子拐道弯才意识到这不是标准库头文件”
    我则是虽然一看就知道它不是标准库头文件,但还是会强迫症地想一遍 “这个东西是多余的” 并且再把 #include 语法从脑子里掏出来验证一遍,非常分散注意力。
    另外,我不清楚 #include <./somelib> 是什么行为…… 小心导致不一致
    haozhang
        29
    haozhang  
    OP
       2019-09-18 07:25:58 +08:00 via Android
    @no1xsyzy 所以我哪里写了...<./xxx>了,你找出来我改
    no1xsyzy
        30
    no1xsyzy  
       2019-09-18 08:59:22 +08:00
    @haozhang 我是说如果你哪天碰到一个别人写的 <./xxx>,结果你就当作是用户自定义库了,而实际上是找标准库的话会造成你读别人代码的混乱。
    另外,根据 C 语言标准, #include "" 和 #include <> 如何寻找都是实现者来决定的:典型地,VC 的标准库和 gcc 的标准库在根本不同的,也不具有可兼容地进行指示的位置。所以说有可能导致某些编译器根本不认 "./xxx",它根本不在本地目录找文件 "xxx" 而是在本地目录找文件 ".%2Fxxx" —— 结果找不到。
    haozhang
        31
    haozhang  
    OP
       2019-09-18 09:39:57 +08:00 via Android
    @no1xsyzy 你说的对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2807 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 115ms · UTC 12:48 · PVG 20:48 · LAX 04:48 · JFK 07:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.