1

基本上,我一直在为我自己设计的一种语言编写一个小而低效的解释器,以此来取乐。用 F# 编写它。奇怪的是,当给它一些冗长的代码来解释时,就像我的循环版本一样"loop true do 0"(这将转化为无限循环),它会尝试连接到网络。我知道是因为我的防火墙注意到它并问我该怎么做。这不是故意的,我的程序中没有一行网络代码。我什至更改为在解释器中循环代码作为一个实验,只是一个永恒的 F# while 循环,所以它只会永远循环而不做任何解释器的事情,但它没有任何效果。

当我说网络相关的东西时,我指的是连接到这两个地址之一: 224.0.0.252239.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
4

0 回答 0