Пример #1
0
function compile($expr, &$oob)
{
    global $ENVIRONMENT;
    if (is_array($expr)) {
        switch ($expr[0] . "") {
            case "def":
                return compile_def($expr, $oob);
            case "define":
                return compile_def($expr, $oob);
            case "fn":
                return compile_fn($expr, $oob);
            case "λ":
                return compile_fn($expr, $oob);
            case "do":
                return compile_do($expr, $oob);
            case "«":
                compile_php($expr, $oob);
                return null;
            case "function":
                return compile_function($expr, $oob);
            case "macro":
                compile_macro($expr, $oob);
                return null;
            case "if":
                return compile_if($expr, $oob);
            case "quote":
                return var_export($expr[1], true);
            case "env":
                return compile_env($expr, $oob);
            case "inline":
                return compile_inline($expr, $oob);
            case "let":
                return compile_let($expr, $oob);
            case "recur":
                return compile_recur($expr, $oob);
            case "set!":
                return compile_set($expr, $oob);
            case "ref":
                return compile_ref($expr, $oob);
            case "-":
            case "*":
            case "/":
            case "+":
                return compile_math($expr, $oob);
            default:
                return compile_call($expr, $oob);
        }
    } else {
        if (is_symbol($expr)) {
            if ($expr . "" == "true") {
                return "true";
            }
            if ($expr . "" == "false") {
                return "false";
            }
            if ($expr . "" == "nil") {
                return "null";
            }
            $p = count($oob["locals"]) - 1;
            if (is_array($oob["locals"][$p]) && in_array($expr, $oob["locals"][$p])) {
                return compile(array(symbol("env"), $expr), $oob);
            }
            //$expr=mangle($expr);
            return "(" . $ENVIRONMENT . "[\"" . symbol_str($expr) . "\"] ? \$" . mangle(symbol_str($expr)) . " : \$GLOBALS[\"" . mangle(symbol_str($expr)) . "\"])";
        }
        if (is_string($expr)) {
            return "\"" . $expr . "\"";
        }
        if ($expr == 0) {
            return "0";
        }
        if ($expr == null) {
            return "null";
        }
        return $expr . "";
    }
}
Пример #2
0
 function _compile_if($arguments, $elseif = false, $while = false)
 {
     $this->internal('compile_if');
     return compile_if($arguments, $elseif, $while, $this);
 }