Armin Rigo avatar Armin Rigo committed 723c1bf

Implement '/'

Comments (0)

Files changed (2)

     return DuInt_FromInt(result);
 }
 
+DuObject *du_div(DuObject *cons, DuObject *locals)
+{
+    int result = 0;
+    int first = 1;
+
+    while (cons != Du_None) {
+        DuObject *expr = _DuCons_CAR(cons);
+        DuObject *next = _DuCons_NEXT(cons);
+
+        DuObject *obj = Du_Eval(expr, locals);
+        if (first) {
+            result = DuInt_AsInt(obj);
+            first = 0;
+        } else {
+            result /= DuInt_AsInt(obj);
+        }
+        Du_DECREF(obj);
+        cons = next;
+    }
+    return DuInt_FromInt(result);
+}
+
 static DuObject *_du_intcmp(DuObject *cons, DuObject *locals, int mode)
 {
     if (cons == Du_None || _DuCons_NEXT(cons) == Du_None ||
     DuFrame_SetBuiltinMacro(Du_Globals, "+", du_add);
     DuFrame_SetBuiltinMacro(Du_Globals, "-", du_sub);
     DuFrame_SetBuiltinMacro(Du_Globals, "*", du_mul);
+    DuFrame_SetBuiltinMacro(Du_Globals, "/", du_div);
     DuFrame_SetBuiltinMacro(Du_Globals, "<", du_lt);
     DuFrame_SetBuiltinMacro(Du_Globals, "<=", du_le);
     DuFrame_SetBuiltinMacro(Du_Globals, "==", du_eq);
     assert evaluate("(* 2 3 7)") == 42
     assert evaluate("(* (+ 5 1) (+ 6 1))") == 42
 
+def test_div():
+    assert evaluate("(/ 11 2)") == 5
+    assert evaluate("(/ 29 2 3)") == 4
+
 def test_cmp():
     assert evaluate("(<  6 6)") == 0
     assert evaluate("(<= 6 6)") == 1
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.