在为AST节点评估解释器时调用循环函数

Gab*_*iel 5 compiler-construction f# functional-programming

我有以下情况:

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"
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,函数runStatement调用 runIfrunIf调用runStatement,因为if语句是由一些通用语句组成的,而一般语句可以是if语句.

我该如何解决这种情况?

PS:我有一个像其他功能类似的情况runWhile,runIfElse等等.

Phi*_*ens 8

使用'和'关键字

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

runx () |> ignore 
Run Code Online (Sandbox Code Playgroud)

版画

runxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxrunyrunxruny
Run Code Online (Sandbox Code Playgroud)