2012-03-25 3 views
2

Mit Racket möchte ich eine Prozedur entwerfen, die als ihre Eingaben eine binäre Operation und zwei Argumente eines beliebigen Typs einnimmt, die binäre Operation auf die Argumente auswertet und eine Zeichenfolge zurückgibt, die das Ergebnis der Auswertung beschreibt. Zum Beispiel, wenn mein Verfahren foo genannt wurden, dannWie gibt man einen String zurück, der ausgewertete Argumente der Prozedur enthält?

(foo + 1 2) 
(foo cons 'bar empty) 

zurückkehren würde

The + of 1 and 2 is: 3 
The cons of 'bar and empty is: (bar) 

Mein Code würde etwas aussehen

(define (foo op a b) 
    (let ((result (op a b))) 
     (display 
     (string-append 
     "The " 
     (arg->string op) 
     " of " 
     (arg->string a) 
     " and " 
     (arg->string b) 
     " is: " 
     (arg->string result) 
     )))) 

Ist es möglich, eine Operation Arg- zu konstruieren > String, der tun würde, was ich will (nämlich sein Argument vor der Umwandlung in eine Zeichenkette auswerten?). Wenn Sie einfach einen String konstruieren oder das Argument im Rumpf der Prozedur zitieren, wird das Literal-Ergebnis zurückgegeben, d. H. "Op" oder "op" anstelle von "+" oder "+".

Jede Hilfe wird geschätzt.

Antwort

3

Diese Lösung ist die einfachste, die in den Sinn kommt:

(define (foo op a b) 
    (printf "The ~s of ~s and ~s is: ~s\n" 
      (object-name op) a b (op a b))) 

sehen, ob dies für Sie arbeitet:

(foo + 1 2) 
> The + of 1 and 2 is: 3 

(foo cons 'bar empty) 
> The cons of bar and() is: (bar) 
+0

@thesook gute Nachricht! Gleich nachdem Sie meine Antwort akzeptiert hatten, fand ich eine Möglichkeit, den Namen der Prozedur anzuzeigen, die genau so ist, wie Sie es wollten. Sehen Sie sich meine aktualisierte Antwort an! :) –

+1

Danke! Das funktioniert perfekt. – thesook

Verwandte Themen