Syntax 导致错误的打印语句?

Syntax 导致错误的打印语句?,syntax,sml,smlnj,Syntax,Sml,Smlnj,这种语言的语法令人困惑 fun bar a = print (Int.toString a); 0 编译。但不知道为什么emacs会缩进0 fun bar a = print (Int.toString a) 0 抛出一个错误 Error: operator is not a function [tycon mismatch] operator: unit in expression: (print (Int.toString a)) 0 fun

这种语言的语法令人困惑

fun bar a =
  print (Int.toString a);
    0
编译。但不知道为什么emacs会缩进0

fun bar a =
  print (Int.toString a)
    0
抛出一个错误

Error: operator is not a function [tycon mismatch]
  operator: unit
  in expression:
    (print (Int.toString a)) 0


fun foo a =
  if a < 0
  then
      0
  else
      0
syntax error: replacing  SEMICOLON with  EQUALOP
沃特


我搞不懂这一点。

看来你很难理解在SML中分号可以用在哪里。有两个主要的地方允许他们:

  • 括号内的组:
    (a;b)
    。这意味着
    a;b
    无效。你需要把它用括号括起来

  • 中的
    中的
    结束
    之间,让
    阻塞。但是,此处不使用括号:

  • 因此,您的最后一个示例应该是:

    fun foo a =
      if a < 0
      then (print (Int.toString a); 0)
      else 0
    
    fun foo a=
    如果a<0
    然后(打印(Int.toString a);0)
    其他0
    

    它们还可以用于分隔文件内或REPL中的顶级表达式或声明,但出于此目的,它们是可选的。这就是为什么要编译您的第一个示例。

    您似乎很难理解在SML中分号可以用在哪里。有两个主要的地方允许他们:

  • 括号内的组:
    (a;b)
    。这意味着
    a;b
    无效。你需要把它用括号括起来

  • 中的
    中的
    结束
    之间,让
    阻塞。但是,此处不使用括号:

  • 因此,您的最后一个示例应该是:

    fun foo a =
      if a < 0
      then (print (Int.toString a); 0)
      else 0
    
    fun foo a=
    如果a<0
    然后(打印(Int.toString a);0)
    其他0
    

    它们还可以用于分隔文件内或REPL中的顶级表达式或声明,但出于此目的,它们是可选的。这就是为什么要编译您的第一个示例。

    部分混淆可能源于一些标准书籍(如乌尔曼的)过度使用分号的方式。分号主要是终止符而不是分隔符,这很容易给人留下这样的印象。有没有办法将print语句用作if/else分支中的最后一条语句,而不从该分支返回()?这种语言感觉像一件紧身胸衣…@lotolmencre
    如果为true,则打印(“foo”)else()
    print
    语句已经是一个单元函数。您可以使用另一个函数
    fun printIfTrue(test,val)=if test then print(val)else()
    将其封装起来。部分混淆可能是由于一些标准书籍(如Ullman的)过度使用分号造成的。分号主要是终止符而不是分隔符,这很容易给人留下这样的印象。有没有办法将print语句用作if/else分支中的最后一条语句,而不从该分支返回()?这种语言感觉像一件紧身胸衣…@lotolmencre
    如果为true,则打印(“foo”)else()
    print
    语句已经是一个单元函数。您可以使用另一个函数
    funprintiftrue(test,val)=if-test-then-print(val)else()
    来包装它。
    fun foo a =
      if a < 0
      then (print (Int.toString a); 0)
      else 0