2016-04-22 13 views
0

Die Syntax in dieser Sprache ist verwirrend.Druckanweisung verursacht Fehler?

fun bar a = 
    print (Int.toString a); 
    0 

kompiliert. Keine Ahnung, warum Emacs die 0 indentiert.

fun bar a = 
    print (Int.toString a) 
    0 

Wirft einen Fehler.

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 

kompiliert.

fun foo a = 
    if a < 0 
    then 
     print (Int.toString a); 
     0 
    else 
     0 

gibt einen Fehler aus.

syntax error: replacing SEMICOLON with EQUALOP 

Wat?

Ich kann keinen Sinn davon machen.

Antwort

3

Es scheint, dass Sie Probleme haben zu verstehen, wo Semikolons in SML verwendet werden können. Es gibt zwei Haupt Orte, wo sie erlaubt sind:

  1. Innerhalb einer geklammerten Gruppe: (a; b). Das bedeutet, dass a; b nicht gültig ist. Sie müssen es in Klammern umbrechen.

  2. Zwischen in und end in einem let Block. Allerdings haben Klammern Sie nicht hier:

let 
    val foo = ... 
in 
    a; 
    b; 
    c 
end 

So, Ihr letztes Beispiel sein sollte:

fun foo a = 
    if a < 0 
    then (print (Int.toString a); 0) 
    else 0 

Sie können auch innerhalb der obersten Ebene Ausdrücke oder Erklärungen zu trennen verwendet werden eine Datei oder an der REPL, aber sie sind optional für diesen Zweck. Deshalb wurde dein erstes Beispiel kompiliert.

+0

Ein Teil der Verwirrung könnte auf die Art und Weise zurückzuführen sein, in der einige der Standardbücher wie Ullman dazu neigen, Semikola zu überstrapazieren. Es ist leicht, den Eindruck zu bekommen, dass Semikolons in erster Linie Terminatoren und nicht Begrenzer sind. –

+0

Gibt es eine Möglichkeit, die print-Anweisung als letzte Anweisung in einem if/else-Zweig zu verwenden und nicht return() von diesem Zweig? Diese Sprache fühlt sich an wie ein Korsett ... –

+0

@lotolmencre 'wenn wahr dann drucke (" foo ") else()'. Die 'print'-Anweisung ist bereits eine Einheitsfunktion. Du könntest das immer mit einer anderen Funktion umschließen: fun printIfTrue (test, val) = wenn test dann print (val) else() '. – eatonphil