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

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

  •  1
     
  •   haozhang · 129 天前 · 3566 次点击
    这是一个创建于 129 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    https://github.com/kanaka/mal

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

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