基本上我一直在为自己设计的语言编写一个小而且非常低效的解释器以获得乐趣。用F#写。奇怪的是,当给它一些冗长的代码来解释时,就像我的循环版本,如"loop true do 0"
(它会转化为无限循环),它会尝试连接到网络。我知道,因为我的防火墙注意到它并询问我该怎么做。这不是故意的,我的程序中没有一行网络代码。我甚至改为在解释器中循环代码作为一个实验,只是一个永恒的F#while循环,所以它会永远循环而不做任何解释器的东西,但它没有效果。
当我说网络相关的东西时,我说的是连接到这两个地址之一:
224.0.0.252
和
239.255.255.250
在谷歌搜索后,我发现224.0.0.252
与LLMNR(链接本地多播名称解析)有关,239.255.255.250
与SSDP(简单服务发现协议)有关但我不知道是什么这意味着。
有没有人知道我的程序为什么会这样做?
编辑:
循环代码看起来像这个atm(故意,检查是否是我的代码是否完成):
and loopExec scope state cond body =
while true do ()
GNil
它尝试连接while循环中的某个位置。在我这之前:
and loopExec scope state cond body =
let myig _ = ()
while (exec scope state cond) <> GBool(false) do
myig <| exec (pushScope scope) state body
GNil
当scope是当前范围时,state是当前状态,cond是条件和body,只要cond为true,应该评估什么。 myig基本上是我用尽了问题的想法,所以我做了自己的忽略功能。 exec执行cond或body中的代码。
它不是最好的代码,我知道这一点。
编辑2:
我刚刚在整个程序的入口点插入了一个永久循环,它仍然可以在调试和发布模式下进行测试。
// Entrypoint of the program
[<EntryPoint>]
let main args =
while true do ()
// Display the greeting message thing
displayHelp()
// Prompt the user for code
Console.Write("> ");
let mutable inp = readCode()
let mutable runCode = true
let state = new Interpreter.State()
while inp.Trim() <> "#exit" do
if not (isValidLine inp) then
if runCode then
execCode state inp
else
printfn "Result: %A\n" (parseString inp)
elif inp = "#help" then
displayHelp()
printfn ""
elif inp = "#ast" then
runCode <- false
elif inp = "#run" then
runCode <- true
elif inp = "#names" then
showNames state
Console.Write("> ")
inp <- readCode()
// Ask the user to press enter before exiting
printfn "[PRESS ENTER TO EXIST]"
Console.Read() |> ignore
Environment.ExitCode