2017-01-23 4 views
0

ich immer einen "Operator erwartet" immer auf der Linie 183, Zeichen 4-7 (bezogen auf den Code hier: http://pastebin.com/VxCM5cAV)Ocaml: Operator in einer Funktion erwartet

das sind die Zeilen i zuletzt hinzugefügt:

let rec sem ((e: exp), (r: eval env)) = 
[...] 
| Apply(Pipe tup, eArg) -> unrollPipe tup sem(eArg, r) r 
[...] 
and rec unrollPipe tup evarg r = match tup with 
    | Seq(Den f, ttup) -> 
     let fclosure= sem(Den f, r) in 
     match fclosure with 
      | Funval(arg, fbody, fDecEnv) -> 
       let fres = sem(fbody, bind(fDecEnv, arg, evarg)) in 
        unrollPipe Pipe(ttup) fres r 
      | RecFunVal(f, arg, fbody, fDecEnv) -> 
       let rEnv= bind(fDecEnv, f, fclosure) in 
       let aEnv= bind(rEnv, arg, evarg) in 
       let fres = sem(fbody, aEnv) in 
        unrollPipe Pipe(ttup) fres r 
    | Seq(Pipe(ftup), ttup) -> 
     let fres = unrollPipe Pipe(ftup) evarg r in 
      unrollPipe Pipe(ttup) fres r 
    | Nil -> evarg 
    | _ -> failwith("bad Pipe") 
;; 

sem sollte eine ((exp * eval env) -> eval) seine Funktion

der Zweck dieses Codes ist es, einen Dolmetscher zu implementieren, die Sie aus einer Abfolge von Funktionen (Funval zusammengesetzt gelten ein Rohr läßt, RecFunVal wird sowohl als "Ide f" als auch als ein anderes P angegeben ipe) zu einem gegebenen Ausdruck, der den Parameter darstellt (ich betrachte nur unäre Funktionen)

zu tun, dass ich jedes Auftreten eines Apply (Pipe (tup), eArg) nehme und den Parameter in ein eval auswerte, dann fahre fort mit mit UnrollPipe (was Spaß macht: tuple * eval -> eval), um die erste Funktion in der Pipe auf den Parameter anzuwenden, den ich vorher ausgewertet habe und der sich dann rekursiv mit dem Schwanz der Pipe und dem Ergebnis der vorherigen Funktion als a aufruft Parameter, der zur Berechnung der Zusammensetzung jeder Funktion in der Rohrleitung führt.

die Typen i in diesem Code verwenden, sind die folgenden:

exp:

type ide = string 
type exp = 
| Eint of int 
| Ebool of bool 
| Den of ide 
| Sum of exp * exp 
| Diff of exp * exp 
| Prod of exp * exp 
| Eq of exp * exp 
| Minus of exp 
| Iszero of exp 
| Or of exp * exp 
| And of exp * exp 
| Not of exp 
| Ifthenelse of exp * exp * exp 
| Let of ide * exp * exp(* Dichiarazione di ide: modifica ambiente*) 
| Fun of ide * exp(* Astrazione di funzione*) 
| Apply of exp * exp (* Applicazione di funzione*) 
| Letrec of ide(*nome fun*)*ide(*par.formale*)*exp(*body fun*)*exp(*body let*) 
| Etup of tuple (*Tupla come espressione*) 
| Pipe of tuple (*Concatenazione di funzioni*) 
| ManyTimes of int * exp (*Esecuzione iterata di una funzione*) 
and tuple = 
| Nil (*Tupla vuota*) 
| Seq of exp * tuple (*Tupla di espressioni*) 
;; 

und eval:

type eval= 
| Int of int 
| Bool of bool 
| Unbound 
| RecFunVal of ide * ide * exp * eval env 
| Funval of efun 
| ValTup of evtuple 
and efun = ide* exp * eval env 
and evtuple = 
| Nil 
| Seq of eval * evtuple 
;; 

EDIT: Ich habe die Funktion mit einem Großbuchstaben benannt, fest das und jetzt gibt es mir einen neuen "Syntax Error" in Zeile 183, Zeichen 4-7 aktualisiert auch die Pastebin (http://pastebin.com/VxCM5cAV)

Antwort

1

Ich bin ungern Links folgen, so kann ich nicht sagen, welche Linie 183 ist.

Der Syntaxfehler, den Sie erhalten, ist möglicherweise auf die rec in and rec zurückzuführen. Laut dem Dokument sollte die rec nur in let rec sein (und wird dann im and Teil impliziert). (Das rec ist in der Tat in Zeichen 4-7, falls die Linie ist die eine.)

Eine andere Sache, die ich bemerkt, ist, dass man unrollPipe als mit drei Argumente definieren, aber es verwenden, um mit vier (nämlich tup, sem, (eArg,r), und r). Das funktioniert, wenn der Rückgabetyp unrollPipe ein Funktionstyp ist; Ich vermute eher, dass Sie einige Klammern verpasst haben.

+0

Dies war die lösung zusammen mit ein paar korrekturen hier und da, wann immer ich rekursiv aufgerufen unrollPipe ich gab Pipe (tup) als Parameter statt nur tup – NokiStrawby

0

Der offensichtlichste Fehler, den ich sehe, ist, dass UnrollPipe mit einem Großbuchstaben beginnt. Funktionsnamen müssen mit einem Kleinbuchstaben beginnen. Versuchen Sie, es in unrollPipe umzubenennen (sagen Sie).

+0

das ist eine sache, gosh ich bin so dumm, wenn es um diese dinge geht, es gibt mir immer noch einen fehler, die post bearbeiten – NokiStrawby