Prechádzať zdrojové kódy

python Ldyn interpreter

Peter Thiemann 3 rokov pred
rodič
commit
8fd489fb53
1 zmenil súbory, kde vykonal 14 pridanie a 19 odobranie
  1. 14 19
      book.tex

+ 14 - 19
book.tex

@@ -16426,7 +16426,7 @@ to represented tagged values.
 @dataclass
 class Tagged:
   value : Value
-  tag : int
+  tag : str
   def __str__(self):
     return str(self.value)
 \end{lstlisting}
@@ -16551,10 +16551,9 @@ class InterpLdyn(InterpLlambda):
           return self.tag(- self.untag(v, 'int', e))
       case IfExp(test, body, orelse):
         v = self.interp_exp(test, env)
-        match self.untag(v, 'bool', e):
-          case True:
+        if self.untag(v, 'bool', e):
             return self.interp_exp(body, env)
-          case False:
+        else:
             return self.interp_exp(orelse, env)
       case UnaryOp(Not(), e1):
         v = self.interp_exp(e1, env)
@@ -16562,18 +16561,16 @@ class InterpLdyn(InterpLlambda):
       case BoolOp(And(), values):
         left = values[0]; right = values[1]
         l = self.interp_exp(left, env)
-        match self.untag(l, 'bool', e):
-          case True:
+        if self.untag(l, 'bool', e):
             return self.interp_exp(right, env)
-          case False:
+        else:
             return self.tag(False)
       case BoolOp(Or(), values):
         left = values[0]; right = values[1]
         l = self.interp_exp(left, env)
-        match self.untag(l, 'bool', e):
-          case True:
-            return True
-          case False:
+        if self.untag(l, 'bool', e):
+            return self.tag(True)
+        else:
             return self.interp_exp(right, env)
       case Compare(left, [cmp], [right]):
         l = self.interp_exp(left, env)
@@ -16591,11 +16588,10 @@ class InterpLdyn(InterpLlambda):
         t = self.interp_exp(tup, env)
         return self.tag(len(self.untag(t, 'tuple', e)))
       case _:
-        return super().interp_exp(e, env)
-
+        return self.tag(super().interp_exp(e, env))
 \end{lstlisting}
 \fi}
-\caption{Interpreter for the \LangDyn{} language \python{, part 1}.}
+\caption{Interpreter for the \LangDyn{} language\python{, part 1}.}
 \label{fig:interp-Ldyn}
 \end{figure}
 
@@ -16609,10 +16605,9 @@ class InterpLdyn(InterpLlambda):
     match ss[0]:
       case If(test, body, orelse):
         v = self.interp_exp(test, env)
-        match self.untag(v, 'bool', ss[0]):
-          case True:
+        if self.untag(v, 'bool', ss[0]):
             return self.interp_stmts(body + ss[1:], env)
-          case False:
+        else:
             return self.interp_stmts(orelse + ss[1:], env)
       case While(test, body, []):
         while self.untag(self.interp_exp(test, env), 'bool', ss[0]):
@@ -16636,7 +16631,7 @@ class InterpLdyn(InterpLlambda):
       case _:
         raise Exception('interp_def unexpected ' + repr(d))
 \end{lstlisting}
-\caption{Interpreter for the \LangDyn{} language \python{, part 2}.}
+\caption{Interpreter for the \LangDyn{} language\python{, part 2}.}
 \label{fig:interp-Ldyn-2}
 \end{figure}
 
@@ -16706,7 +16701,7 @@ class InterpLdyn(InterpLlambda):
           return Tagged(v, 'int')
       elif isinstance(v, Function):
           return Tagged(v, 'function')
-      elif isinstance(v, list):
+      elif isinstance(v, tuple):
           return Tagged(v, 'tuple')
       elif isinstance(v, type(None)):
           return Tagged(v, 'none')