如何验证 bash 脚本控制 ghci (Haskell) 的输出

How to verify output from bash script controlling ghci (Haskell)

我正在尝试创建用于评估的测试脚本。该脚本需要打开 Haskell GHCI 并向 ghci 发送各种命令并检查输出是否正确。它需要一直持续到所有命令结束,并给出一个最终的分数,即如果输出不正确,不要只停止运行。目前,我有这个。

#!/bin/env expect


spawn ghci
expect ".*> "
send ":l main.hs\n"
expect "*Main>"

send "transform [(5,1),(6,1),(8,15),(9,1)]\n"

expect "*Main>"

它打开 ghci 并加载正确的 haskell 文件 (main.hs)。然后它使用该列表参数运行 t运行sform 函数。我怎样才能得到这个来验证输出是否等于我想要的并相应地给出分数。例如:伪

#!/bin/env expect


spawn ghci
expect ".*> "
send ":l main.hs\n"
expect "*Main>"

send "transform [(5,1),(6,1),(8,15),(9,1)]\n"
if OUTPUT = [(5,5),(6,5),(8,5),(9,5)]
then POINTS+= 5

send "translate [(5,1),(6,1),(8,15),(9,1)]\n"
if OUTPUT = [(5,10),(6,10),(8,10),(9,10)]
then POINTS+= 5

expect "*Main>"
send ":quit"

OUTPUT SCORE

所有命令都在 Haskell 中完成,但 运行 来自 shell 脚本。有人可以帮忙吗?

这是一种(未经测试的)方法:

#!/bin/env expect

spawn ghci
expect "*> "
send ":l main.hs\n"
expect "*Main>"
set POINTS 0

send "transform [(5,1),(6,1),(8,15),(9,1)]\n"
expect {
    -ex {[(5,5),(6,5),(8,5),(9,5)]} {
        incr POINTS 5
        exp_continue
    }
    *Main>
}

send "translate [(5,1),(6,1),(8,15),(9,1)]\n"
expect {
    -ex {[(5,10),(6,10),(8,10),(9,10)]} {
        incr POINTS 5
        exp_continue
    }
    *Main>
}

send ":quit"

puts $POINTS

有关详细文档,请参阅 https://www.tcl.tk/man/expect5.31/expect.1.html and https://www.tcl-lang.org/man/tcl/TclCmd/contents.htm