为解释器评估 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.: 我和其他函数有类似的情况,比如 runWhilerunIfElse 等等。

使用'and'关键字

let rec runx () = 
    printf "runx"
    runy ()
and runy () =
    printf "runy"
    runx ()

runx () |> ignore 

打印

runxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxruny