基本上,我一直在为我自己设计的一种语言编写一个小而低效的解释器,以此来取乐。用 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 是条件和主体,只要 cond 为真,就应该评估什么。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