为解释器评估 AST 节点时的循环函数调用
Circular function calls when evaluating AST nodes for interpreter
我有以下情况:
let private runStatement (vars : Map<identifier, value>) stmt =
match stmt with
| Assignment (id, expr) -> runAssignment vars id expr
| Print exprs -> runPrint vars exprs
| Read id -> runRead vars id
| If (cond, stmts) -> runIf vars cond stmts
let rec private runStatements vars stmts =
match stmts with
| stmt::rest ->
let newVars = runStatement vars stmt
runStatements newVars rest
| [] -> vars
let private runIf vars conditionalValue statements =
match conditionalValue with
| Boolean v when v -> runStatements vars statements
| Boolean v -> vars
| _ -> failwith "Not a boolean expression in if statement"
如你所见,函数runStatement
调用runIf
,而runIf
调用runStatement
,因为一个if语句是由一些通用语句组成的,而一个一般语句可以是 if 语句。
我该如何解决这种情况?
PS.: 我和其他函数有类似的情况,比如 runWhile
、runIfElse
等等。
使用'and'关键字
let rec runx () =
printf "runx"
runy ()
and runy () =
printf "runy"
runx ()
runx () |> ignore
打印
runxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxruny
我有以下情况:
let private runStatement (vars : Map<identifier, value>) stmt =
match stmt with
| Assignment (id, expr) -> runAssignment vars id expr
| Print exprs -> runPrint vars exprs
| Read id -> runRead vars id
| If (cond, stmts) -> runIf vars cond stmts
let rec private runStatements vars stmts =
match stmts with
| stmt::rest ->
let newVars = runStatement vars stmt
runStatements newVars rest
| [] -> vars
let private runIf vars conditionalValue statements =
match conditionalValue with
| Boolean v when v -> runStatements vars statements
| Boolean v -> vars
| _ -> failwith "Not a boolean expression in if statement"
如你所见,函数runStatement
调用runIf
,而runIf
调用runStatement
,因为一个if语句是由一些通用语句组成的,而一个一般语句可以是 if 语句。
我该如何解决这种情况?
PS.: 我和其他函数有类似的情况,比如 runWhile
、runIfElse
等等。
使用'and'关键字
let rec runx () =
printf "runx"
runy ()
and runy () =
printf "runy"
runx ()
runx () |> ignore
打印
runxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxruny