2016-10-26 1 views
0

J'essaie de définir une fonction qui marque les appels queue vs non-tail dans un schéma sexpr dans. Il serait défini comme suit:Fonction d'écriture qui différencie les appels queue et non-tail Schéma

TCS ::= SYMBOL | NUMBER | IF | FUNCTION-CALL 

IF ::= (if TCS TCS TCS) 

FUNCTION-CALL ::= (TCS TCS...) 

un exemple d'une entrée/sortie serait:

(mark-tail-calls '(if (a (b c)) (e (f g) h) i) (j (k 7))) 
=> (if (non-tail-call a (non-tail-call b c)) (non-tail-call e (non-tail-call f g) h) i) (tail-call j (non-tail-call k 7)) 

Je comprends la différence entre une queue et un appel non-queue, mais je suis finidng il difficile d'écrire la fonction étant donné que j'ai peu d'expérience avec le régime. Toute aide/pointe vers la bonne direction serait appréciée

Répondre

0

Si tout va bien un petit coup de pouce pour vous aider à démarrer:

Vous le feriez habituellement une analyse de cas sur la structure de l'entrée (et récursion).

Quelque chose le long des lignes de

(define (mark-tail-calls e) 
    (cond ((null? e) '()) 
      ((symbol? e) e) 
      ((number? e) e) 
      ((if? e) (list 'íf ...) 
      ((symbol? (car e)) ...) 
      (#t ...)))) 

Lorsque if? est défini comme

(define (if? e) 
    (and (pair? e) 
     (equal? (car e) 'if)))