为了账号安全,请及时绑定邮箱和手机立即绑定

Go中的方案解释器

Go中的方案解释器

Go
呼唤远方 2021-10-18 17:10:48
我是一个相当基本的 Go 程序员,我一直在研究这个小型 Scheme 解释器,我一直试图了解它是如何工作的。我在这里找到它:https : //pkelchte.wordpress.com/2013/12/31/scm-go/我阅读了网页,但我仍在努力理解它是如何工作的,因为源代码显然是由比我更熟悉 Go 的人编写的。特别是我很难理解这些行:e := expression.(type) // Line 73我不确定这.(type)部分是什么意思,我以为它是铸造的,但它看起来不像我以前见过的铸造。switch p := procedure.(type) {case func(...scmer) scmer:    value = p(args...)case proc:    en := &env{make(vars), p.en}    switch params := p.params.(type) {    case []scmer:        for i, param := range params {            en.vars[param.(symbol)] = args[i]        }    default:        en.vars[params.(symbol)] = args    }    value = eval(p.body, en)老实说,我真的不明白这些代码中的任何一个。第 73 - 86 行*tokens = (*tokens)[1:] // Line 208我不确定这一行是什么意思,因为它的语法很奇怪。我知道它的指针和括号是因为 *. 但我不确定那条线在做什么。最后有这些行:token := (*tokens)[0]*tokens = (*tokens)[1:]switch token {case "(": //a list begins    L := make([]scmer, 0)    for (*tokens)[0] != ")" {        if i := readFrom(tokens); i != symbol("") {            L = append(L, i)        }    }    *tokens = (*tokens)[1:]    return L我也不知道这些线是做什么的。第 198 - 209 行这是完整的代码,如果你想要的话,我知道它有 250 行长,但我真的很感激尽可能多地解释它的作用。
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

第一个是类型开关。您可以在此处阅读更多相关信息

第二个是像 python 中的切片(如果你知道,应该很熟悉)

ls = ls[1:]

我们正在跳过第一项并获取切片/列表的其余部分。

正如我从您的评论中看到的那样,我认为这不是试验 golang 的好起点。


查看完整回答
反对 回复 2021-10-18
?
HUWWW

TA贡献1874条经验 获得超12个赞

e := expression.(type)是一个类型断言。


switch p := procedure.(type) {(带有以下 case 语句)是一个类型 switch。


*tokens = (*tokens)[1:]是一个切片表达式,改变存储在 中的值*tokens。


token := (*tokens)[0]       // Set token to first element of tokens slice.

*tokens = (*tokens)[1:]     // Update tokens to remove first element.

switch token {              // Switch on token.

case "(": //a list begins   // If token is "("

    L := make([]scmer, 0)       // Make a new, empty slice.

    for (*tokens)[0] != ")" {   // While the first element of tokens is not ")":

                                    // Read from tokens; if not empty symbol:

        if i := readFrom(tokens); i != symbol("") {

            L = append(L, i)        // Add the token read (in i) to L.

        }

    }

    *tokens = (*tokens)[1:]     // Remove the first element from tokens.

    return L                    // Return the newly created slice.


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信