2016-04-13 12 views
3

Unter welchen Umständen benötigt ein Looping-Konstrukt eine Auswertung durch den Interpreter in Rot? Welche Schleifenkonstrukte nicht?Wann müssen Red-Looping-Strukturen interpretiert werden?

Update (2015.04.20):

Unten ist ein kleines Programm, das ich die Sprache zu einigen Studenten Demo geschrieben. Zwei der Funktionen "list" und "find" haben foreach Schleifen in ihnen. Aber die foreach-Schleifen werden nicht ausgeführt, wenn sie nicht in einen do-Block gehüllt sind. Insbesondere dieses Szenario hat die ursprüngliche Frage ausgelöst, da der Körper der foreach-Schleifen nicht indirekt spezifiziert ist.

Model.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 
] 

Console.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 
] 

Antwort

2

Es ist nicht abhängig von dem Schleifenkonstrukt, aber auf dem Weg geben Sie den Looping Körperblock und (wenn es gilt), der bedingte Block. Wenn diese Blöcke nicht wörtlich, sondern indirekt mit Wörtern angegeben werden, dann werden sie interpretiert, da der Compiler sie dann nicht statisch bestimmen kann. Zum Beispiel:

n: 3 until [print n n = 0] 

ist übersetzbar, während:

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

nicht.