将命令行参数写入SML中的文件
我正在尝试将将命令行参数写入SML中的文件,sml,smlnj,ml,Sml,Smlnj,Ml,我正在尝试将SML程序中的命令行参数写入一个文件,每个参数位于单独的一行。如果在命令行上运行sml main.sml a b c easy as 1 2 3,所需的输出将是一个包含以下内容的文件: a b c easy as 1 2 3 但是,我从SML获得以下输出: $ sml main.sml a b c easy as 1 2 3 val filePath = "/Users/Josue/Desktop/espi9890.txt" : string val args = ["a","b"
SML
程序中的命令行参数写入一个文件,每个参数位于单独的一行。如果在命令行上运行sml main.sml a b c easy as 1 2 3
,所需的输出将是一个包含以下内容的文件:
a
b
c
easy
as
1
2
3
但是,我从SML获得以下输出:
$ sml main.sml a b c easy as 1 2 3
val filePath = "/Users/Josue/Desktop/espi9890.txt" : string
val args = ["a","b","c","easy","as","1","2","3"] : string list
main.sml:4.21错误:语法错误:插入EQUALOP
/usr/local/smlnj/bin/sml:致命错误--未捕获的异常编译,在处引发“语法错误”
../compiler/Parse/main/smlfile.sml:15.24-15.46
使用此代码:
val filePath = "/Users/Josue/Desktop/espi9890.txt";
val args = CommandLine.arguments();
fun writeListToFile x =
val str = hd x ^ "\n";
val fd = TextIO.openAppend filePath;
TextIO.output (fd, str);
TextIO.closeOut fd;
writeListToFile (tl x);
| fun writeListToFile [] =
null;
writeListToFile args;
我遗漏了什么吗?嵌套值声明的正确语法是:
fun writeListToFile (s::ss) =
let val fd = TextIO.openAppend filePath
val _ = TextIO.output (fd, s ^ "\n")
val _ = TextIO.closeOut fd
in writeListToFile ss end
| writeListToFile [] = ()
就是
让。。。在里面结束
[]
,将永远不会匹配,因为第一个模式,x
,更通用,并且匹配所有输入列表(包括空列表)。因此,即使您的语法错误已修复,此函数也会循环直到崩溃,因为您试图获取空列表的hd
/tl
fun
,其余必须加上|
。(您可以自由决定如何缩进。)不允许声明的code>运算符,例如在
中的和
结束之间或括号内null
没有意义。您可能认为nil
(空列表,也称为[]
),但是val null:'a list->bool
是一个函数!实际上,这个函数有一个返回值是荒谬的。如果有的话,它可能是一个bool,指示行是否被成功写入(在这种情况下,您可能需要处理IO异常)。最接近不返回任何内容的函数是返回类型单位(值为()
)的函数hd
/tl
拆分列表,但也可以使用模式匹配。使用模式匹配,就像我给出的例子一样val.=…
声明;也;这只是品味的问题。例如:
fun writeListToFile (s::ss) =
let val fd = TextIO.openAppend filePath
in TextIO.output (fd, s ^ "\n")
; TextIO.closeOut fd
; writeListToFile ss
end
| writeListToFile [] = ()
fun writeListToFile lines =
let val fd = TextIO.openAppend filePath
fun go [] = TextIO.closeOut fd
| go (s::ss) = ( TextIO.output (fd, s ^ "\n") ; go ss )
in go lines end
val映射:('a->'b)->'a list->'b list
,但是由于TextIO.output
返回一个单位,非常类似的val应用程序:('a->unit)->'a list->unit
甚至更好:
fun writeListToFile lines =
let val fd = TextIO.openAppend filePath
in List.app (fn s => TextIO.output (fd, s ^ "\n")) lines
; TextIO.closeOut fd
end
appendListFile
,或者简单地调用appendLines
,并将filePath
作为函数的参数,因为filePath
意味着它是一个文件,并且该函数会向每个s
添加换行符。名字很重要
fun appendLines filePath lines =
let val fd = TextIO.openAppend filePath
in List.app (fn s => TextIO.output (fd, s ^ "\n")) lines
; TextIO.closeOut fd
end
嵌套值声明的正确语法为:
fun writeListToFile (s::ss) =
let val fd = TextIO.openAppend filePath
val _ = TextIO.output (fd, s ^ "\n")
val _ = TextIO.closeOut fd
in writeListToFile ss end
| writeListToFile [] = ()
就是
让。。。在里面结束
[]
,将永远不会匹配,因为第一个模式,x
,更通用,并且匹配所有输入列表(包括空列表)。因此,即使您的语法错误已修复,此函数也会循环直到崩溃,因为您试图获取空列表的hd
/tl
fun
,其余必须加上|
。(您可以自由决定如何缩进。)不允许声明的代码>运算符,例如在
中的和
结束之间,或在括号内。