Home
 

Sitzungen mit Hugs

Sitzungen mit Hugs

Hugs ist ein Interpreter mit dem typischen "`read-evaluate-write"'-Zyklus;

Hugs wertet aus:

  • Haskell Ausdrücke

    abgestützt auf Funktionssammlung im Standard-Prelude und/oder vom Benutzer geladenen Dateien mit Haskell Definitionen.

    Ausdrücke werden durch "`Return"' abgeschlossen!

  • durch ``:'' eingeleitete Kommandos, z.B.:
     :?      - listet Kommandos auf
    
    :quit - beendet die Sitzung

Einige Beispiele:

 1 pohlmann@okapi:hugs

___ ___ ___ ___ __________ __________
/ / / / / / / / / _______/ / _______/ Hugs 1.4
/ /___/ / / / / / / / _____ / /______
/ ____ / / / / / / / /_ / /______ / The Nottingham and Yale
/ / / / / /___/ / / /___/ / _______/ / Haskell User's System
/__/ /__/ /_________/ /_________/ /_________/ Version 970410


Copyright (c) The University of Nottingham and Yale University, 1994-1997.
Bug reports: hugs-bugs@haskell.org. Web: http://www.haskell.org/hugs.


Reading file "/usr/local/lib/hugs/lib/Prelude.hs":


Hugs session for:
/usr/local/lib/hugs/lib/Prelude.hs
Type :? for help
Prelude> 37-(2+5)
30
Prelude> 27-2+5
30
Prelude> min 3 4
3
Prelude> 3==4
False
Prelude> sum [1..10]
55
Prelude> reverse "Salzburg"
"grubzlaS"
Prelude>

Natürlich gibt's auch Fehlermeldungen -- für syntaktisch falsche Ausdrücke, undefinierte Bezeichner oder unanständige Wünsche, ...

1.

Prelude> 37-(2+5


ERROR: Syntax error in expression (unexpected end of input)

2.

Prelude> 37-(2+n)
ERROR: Undefined variable ``n''
3.

Prelude> let n=5 in 37-(2+n) -so geht's, und dies ist ein Kommentar!
30
4.

Prelude> 37-True
ERROR: Bool is not an instance of class ``Num''
5.

Prelude> 37`div`(5-5)


Program error: primDivInt 37 0

6.

Prelude> let x=x in x
ERROR: Cannot find ``show'' function for:
*** expression : let ... in x
*** of type : a
7.

Prelude> let x::Int; x=x in x
Interrupted! - mit Control-C

Richtige Programmierer wollen natürlich ihre eigenen Funktionen, Konstanten, Datentypen, ...definieren. Solche "`Script"' genannte Sammlungen von Definitionen werden in eine Datei geschrieben und vor Gebrauch geladen:

 :load bla.bla

es ist sinnvoll, das Suffix ``.hs'' zu verwenden (es gibt Werkzeuge, die das brauchen);
außer solchen unstrukturierten Sammlungen gibt es auch einen Modulbegriff mit entsprechenden Bezügen (Export / Import), mehr dazu später!

Beispiel:

Datei bla.bla:

 area r=pi*r*r

where pi=3.1416

Datei error.bla:

 area r=pi*r*r

were pi=3.1416

Damit folgende Hugs-Sitzung:

 Prelude> :load bla.bla

Reading file "bla.bla":


Hugs session for:
/usr/local/lib/hugs/lib/Prelude.hs
bla.bla
Main> area 10
314.16
Main> :load error.bla
Reading file "error.bla":
Parsing
ERROR "error.bla" (line 2): Syntax error in input (unexpected `=')

Fehlermeldungen sind manchmal etwas schwierig zu interpretieren, woran oft die ungewohnte Typ-Philosophie von Haskell schuld ist (siehe später).

Im ersten Beispiel gilt:

1.
fehlende Klammer
2.
n ist keine "`Programmvariable"', sondern eine Variable im üblichen mathematischen Sinn, d. h. ein Konstantenbezeichner, wobei der Wert natürlich willkürlich ist, aber festgelegt werden muß,
3.
diese Festlegung kann man mit ``let'' machen,
4.
Typfehler: die Subtraktionsoperation ist (überladen!) für mehrere numerische Typen definiert, aber Bool ist kein numerischer Typ
5.
Division durch 0 (`div` ist abgestützt auf eine speziellere elementare Divisionsoperation)
6.
let x=x in x führt auf Endlos-Schleife (=Wert von x ist undefiniert, wird aber "`gesucht"';

hier: Typ von x unklar, deshalb kann nicht die geeignete Funktion ``show'' zur Ausgabe des Ergebnisses bestimmt werden,

7.
hier wird das Ergebnis als ``Int'' deklariert, und schon sind wir in der Endlos-Schleife ...

beachte:

  • eine Gleichung wie pi = 3.14 oder area r = ... bindet einen Bezeichner an einen Wert (insbesondere ist also pi Konstant, nicht Variable)
  • der Gebrauch einer ``where''-Klausel macht pi lokal zur Definition von area ( $\Rightarrow$ später);

    grundsätzlich ist ein Skript eine Menge von Definitionen, die sich aufeinander beziehen können, aber z.B. auch:

     pi = 3.14      - besser umbenennen: name clash mit Prelude!
    
    area r = pi * r * r
    circumference r = 2 * pi * r
  • beim Laden werden die Definitionen analysiert und übersetzt, aber werden auch bei dieser Gelegenheit Syntaxfehler im Skript gemeldet!

nextnextupuppreviouspreviouscontentscontents
Next:Grundlegende SprachelementeUp:Kurze Rundreise durch HaskellPrevious:Kurze Rundreise durch Haskell
Ronald Blaschke
1998-04-19