2016-06-30 10 views
1

Ich habe schon eine Weile in Chicken Scheme herumgespielt, aber mir ist etwas Ungewöhnliches aufgefallen. Lassen Sie uns sagen, dass ich die folgende einfache Quelldatei haben:Chicken Scheme: Fehlende Warnungen/Fehlermeldungen beim Laden oder Kompilieren

(define (f x) 
    (g x)) 

Es ist offensichtlich, (auf eine menschliche Bohne), dass dies nicht funktionieren kann. Als ich csi starten und diese Funktion manuell Definition gebe ich die folgende Meldung:

Note: the following toplevel variables are referenced but unbound: 

    g (in f) 

Das ist gut zu wissen! Das Finden von Tippfehlern in größeren Programmen ist gut, bevor Sie sie ausführen. Nun lassen Sie uns csi wieder starten und versuchen, load die Datei:

(load "test.scm") 

Ausgang:

; loading test.scm ... 

Note: the following toplevel variables are referenced but unbound: 

    g (in f) 

Auch gut. Versuchen wir jetzt, csi mit dieser Datei zu starten!

$ csi test.scm 

CHICKEN 
(c) 2008-2015, The CHICKEN Team 
(c) 2000-2007, Felix L. Winkelmann 
Version 4.10.0 (rev b259631) 
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ] 
compiled 2015-08-04 on yves.more-magic.net (Linux) 

; loading test.scm ... 
#;1> 

Uh ... wohin ist die Fehlermeldung gegangen? Warum ist es nicht da? Okay, vielleicht wird es sich beschweren, wenn ich tatsächlich versuche, es zu kompilieren ...

Nein. Selbst wenn ich am Ende der Datei die Zeile (f 2) anlege (um zu vermeiden, dass die f-Funktion entfernt wird), bekomme ich immer noch keine beliebige Art von Fehlermeldung oder Warnung.

Warum? Wie kann der Interpreter (oder zumindest das Handbuch load Teil davon) sofort dieses Problem bemerken, aber der Compiler kann nicht? Lustigerweise gibt es ein -no-warnings Argument für den Compiler. Wie erwartet, tut es nichts, da es keine Warnungen gibt.

Was fehlt mir? Wie kann ich es reparieren? Kann es behoben werden oder muss ich manuell load jede einzelne beteiligte Datei manuell in csi vor dem eigentlichen kompilieren irgendwelche Programme mit einiger Zuversicht?

Antwort

2

Der Grund, dass dies keine Fehlermeldung gibt, ist, dass CHICKEN unterstützt separate Kompilierung. Dies funktioniert genau wie in Beispiel C: Sie können Dateien separat kompilieren und später zu einer ausführbaren Datei verknüpfen. Es ist auch möglich, eine Variable im Code eval (neu) zu definieren, was bedeutet, dass der Compiler nicht zu viele Annahmen darüber machen kann (standardmäßig).

Wenn Sie einen Fehler erhalten möchten, würde ich Ihnen Module vorschlagen. Diese sollen vollständig sein „geschlossene Welten“, also wenn eine Kennung unreferenced ist, wird es zu einem Fehler:

$ cat foo.scm 

(module foo (f) 
    (import chicken scheme) 
    (define (f x) 
    (g x)) 
) 

$ csc foo.scm 
Warning: reference to possibly unbound identifier `g' in: 
Warning: main#f 

Error: module unresolved: main 

Error: shell command terminated with non-zero exit status 256: csc foo.scm 

Sie auch csc -M verwenden können, um implizit den gesamten Code in einem (namenlos) -Modul zu wickeln, für Bequemlichkeit.

+0

Danke, das hat funktioniert! – cronotk