2016-03-31 8 views
0

Ich versuche, eine Funktion im Schema zu definieren, die eine Nachricht beim Aufruf, gefolgt von einem Zeilenumbruch druckt. Um dies zu tun Ich habe versucht, wie dieses verschachtelte Lambda zu verwenden:verschachtelte Lambda in Schema

(define message 
    (lambda (msg) 
     (lambda (newL) 
      (newline) 
     ) 
    (display msg)) 
) 

Allerdings, wenn ich dies tun, und rufen Sie die Funktion wie:

(message "#f") 

es nur die #f druckt, und tut Erstellen Sie keine Zeilenumbrüche. Wenn ich die Lambda-Ordnungen in der Funktion umkehre und die Position der newL- und msg-Lambdas vertausche, dann druckt sie nur einen Zeilenumbruch und zeigt die Nachricht nicht an!

Die Funktion in diesem Block von Code aufgerufen wird:

(define (permute upList) 
    (if (null? upList) 
     (message "#f") 
     ;permutation code 
    ) 
)  

Die Fehlermeldung erhalten, wenn sie nicht verschachtelten LAMBDA ist wie folgt:

Fehler: Aufruf von nicht-Prozedur: #

Call history: 

    <syntax>   (permute (quote())) 
    <syntax>   (quote()) 
    <syntax>   (##core#quote()) 
    <eval> (permute (quote())) 
    <eval> [permute] (null? upList) 
    <eval> [permute] (message "#f") 
    <eval> [message] ((display msg) (newline)) 
    <eval> [message] (display msg) 
    <eval> [message] (newline) <-- 

Jede Hilfe wäre willkommen.

+0

Warum brauchen Sie überhaupt ein verschachteltes Lambda? Tun Sie einfach '(definieren Sie Nachricht (Lambda (msg) (Anzeige msg) (newline)))', oder, noch einfacher, '(define (Nachricht msg) (Anzeige msg) (newline))'. –

+0

Warum würden Sie verschachtelte Lambdas verwenden? – uselpa

+0

Es gibt mir eine Fehlermeldung "Call of Non-Prozedur", weil ich es in einer Funktion aufrufen, die in einer Liste als ein Argument nehmen. – Starscreen60

Antwort

0

In diesem Code erstellen Sie nur ein Prozedur-Objekt, das dann sofort verworfen:

(define message 
    (lambda (msg) 
    (lambda (newL) 
     (newline)) 
    (display msg))) 

Es ist wie zu tun:

(define message 
    (lambda (msg) 
    1234 
    (display msg))) 

Die 1234 hier wird ausgewertet, sondern den Wert wird komplett ignoriert.

Wenn Sie ein Verfahren haben, und Sie wollen es sofort anrufen, müssen Sie in einem zusätzlichen Satz von Klammern wickeln (weil in Schema im allgemeinen Pars Anwendung darstellen):

(define message 
    (lambda (msg) 
    ((lambda (newL) 
     (newline)) #f) 
    (display msg))) 

Aber, wie Andere haben darauf hingewiesen, dass in diesem Fall kein verschachteltes Lambda erzeugt werden muss. Außerdem ignoriert das Verfahren sein Argument sowieso, weshalb ich ein Argument erfinden musste, um es zu bestehen; Ich habe #f benutzt, weil das der typische "egal" -Wert ist. Sie können nur tun:

(define message 
    (lambda (msg) 
    (newline) 
    (display msg))) 
+0

Danke, ich denke, das verdeutlicht meine Zweifel – Starscreen60

+0

Wenn dies Ihre Frage beantwortet, akzeptieren Sie es bitte, so dass diese Frage als "beantwortet" markiert ist. Der Hauptgrund, warum ich auf Stack Overflow bin, ist zu vermeiden, dass HUHN-Fragen unbeantwortet bleiben! – sjamaan