3

在什么情况下,循环结构需要由 Red 解释器进行评估?哪些循环结构没有?

更新(2015 年 4 月 20 日):

下面是我编写的一个小程序,用于向一些学生演示该语言。其中两个函数 'list 和 'find 中有 foreach 循环。但是 foreach 循环不会运行,除非它们被包裹在一个 do 块中。这种情况尤其是引发原始问题的原因,因为没有间接指定 foreach 循环的主体。

模型.red

Red [
    Title: "Model"
    Author: "Thomas Royko"
    Version: 0.0.1
]

entry!: make object! [
    name: ""
    quantity: 0
    notes: ""
    display: does [
        print ["-- " name]
        print ["-- " quantity]
        print ["-- " notes newline]
    ]
]

enter: func [
    entries value
    /local quantity notes
] [
    qt: load ask "Enter quantity: "
    nt: ask "Enter notes: "
    append entries make entry! copy [
        name: value
        quantity: qt
        notes: nt
    ]
    print ""
]

find: func [
    entries value
    /local found entry
] [
    found: false
    do [
        foreach entry entries [
            if entry/name = value [
                entry/display
                found: true
                break
            ]
        ]
    ]
    if not found [
        print ["** No entry with code" value newline]
    ]
]

list: func [
    entries
] [
    do [
        foreach entry entries [
            entry/display
        ]
    ]
]

finish: func [
    entries
] [
    save %inventory.db entries
    quit
]

控制台.red

Red [
    Title: "Console"
    Author: "Thomas Royko"
    Version: 0.0.1
]

#include %Bindings.red
#include %Model.red

entries: either exists? %inventory.db [
    reduce load %inventory.db
] [
    copy []
]

rule: [
    (value: "")
    1 [
        ["e" space copy value to end (enter entries value)] |
        ["f" space copy value to end (find entries value)] |
        ["l" to end (list entries)] |
        ["q" to end (finish entries)] |
        [(print ["** Code not recognized" newline])]
    ]
]

forever [
    parse ask "Command: " rule
]
4

1 回答 1

2

它不依赖于循环结构,而是依赖于你指定循环体块和(当它适用时)条件块的方式。如果这些块不是字面上指定的,而是间接使用单词,那么它将被解释,因为编译器不能静态地确定它们。例如:

n: 3 until [print n n = 0]

是可编译的,而:

body: [print n n = 0]
n: 3 until body

不是。

于 2016-04-13T22:46:33.110 回答