Go中的方案解释器

我是一个相当基本的 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 行长,但我真的很感激尽可能多地解释它的作用。


呼唤远方
浏览 162回答 2
2回答

收到一只叮咚

第一个是类型开关。您可以在此处阅读更多相关信息。第二个是像 python 中的切片(如果你知道,应该很熟悉)ls = ls[1:]我们正在跳过第一项并获取切片/列表的其余部分。正如我从您的评论中看到的那样,我认为这不是试验 golang 的好起点。

HUWWW

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.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go