]> code.bitgloo.com Git - clyne/forspll.git/commitdiff
recursion; list via support.c
authorClyne Sullivan <clyne@bitgloo.com>
Sun, 16 Jun 2024 01:06:27 +0000 (21:06 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sun, 16 Jun 2024 01:06:27 +0000 (21:06 -0400)
ast.cpp
main.cpp
support.c
test.fp

diff --git a/ast.cpp b/ast.cpp
index 3543ee1a366c7035f29f519387ee05daba9a668b..a528cc3ef52499e0f5a98e5ee1ff4d3ca404fdcc 100644 (file)
--- a/ast.cpp
+++ b/ast.cpp
@@ -58,12 +58,20 @@ PopAST::PopAST(const std::string& n): BaseAST(n) {}
 
 llvm::Value *PopAST::codegen(LLVMState& llvmState) const
 {
-    auto gep = llvmState.createPop();
-    auto var = llvmState.createVariable(name);
-    auto load = llvmState.builder.CreateLoad(llvmState.inttype, gep);
-    llvmState.builder.CreateStore(load, var, false);
+    if (name == "self") {
+        extern std::list<ThunkAST> scope;
+        auto func = scope.back().func;
+        auto var = llvmState.createVariable(name);
+        llvmState.builder.CreateStore(func, var, false);
+        return Var::addLocal(name, var).value;
+    } else {
+        auto gep = llvmState.createPop();
+        auto var = llvmState.createVariable(name);
+        auto load = llvmState.builder.CreateLoad(llvmState.inttype, gep);
+        llvmState.builder.CreateStore(load, var, false);
 
-    return Var::addLocal(name, var).value;
+        return Var::addLocal(name, var).value;
+    }
 }
 
 CallAST::CallAST(const std::string& n): BaseAST(n) {}
index a632c9b9a4ec597854d30a90483740e94faa2a5a..19b76fe76a6fa020225d50d608304054b642b006 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -31,7 +31,7 @@
 #include "var.hpp"
 
 static LLVMState llvmState;
-static std::list<ThunkAST> scope;
+std::list<ThunkAST> scope;
 
 static bool parseString(std::string_view sv);
 
@@ -42,8 +42,10 @@ int main()
     std::string line;
     for (unsigned lineno = 1; std::cin.good(); ++lineno) {
         std::getline(std::cin, line);
-        if (!parseString(line))
+        if (!parseString(line)) {
             std::cerr << "    at line " << lineno << std::endl;
+            return -1;
+        }
     }
 
     llvmState.output();
index cc0304f916a5f56f6327da71c3cdd394f9d97a60..44a39e47050e57299fa7ca603e57c169ae55d6fc 100644 (file)
--- a/support.c
+++ b/support.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdint.h>
+#include <stdlib.h>
 
 extern int32_t sp;
 extern int32_t stack;
@@ -9,6 +10,11 @@ void emit()
     putchar(*(&stack + --sp));
 }
 
+void print()
+{
+    printf("%d\n", *(&stack + --sp));
+}
+
 void sub()
 {
     int32_t *st = &stack;
@@ -33,3 +39,33 @@ void eq()
     --sp;
     st[sp - 1] = st[sp - 1] == st[sp];
 }
+
+void cons()
+{
+    int32_t *st = &stack;
+    int32_t *pair = malloc(2 * sizeof(int32_t));
+    --sp;
+    pair[0] = st[sp];
+    pair[1] = st[sp - 1];
+    st[sp - 1] = (int32_t)pair;
+}
+
+void car()
+{
+    int32_t *st = &stack;
+    st[sp - 1] = ((int32_t *)st[sp - 1])[0];
+}
+
+void cdr()
+{
+    int32_t *st = &stack;
+    st[sp - 1] = ((int32_t *)st[sp - 1])[1];
+}
+
+void decons()
+{
+    int32_t *st = &stack;
+    --sp;
+    free((int32_t *)st[sp]);
+}
+
diff --git a/test.fp b/test.fp
index 015f2ee6a415e124dafe577e2b4f6a8700a16368..498a3eb496fd56c1cd53a24732ba53e7829bebd7 100644 (file)
--- a/test.fp
+++ b/test.fp
   (nil eq)            $null?
   ($x x)              $force
   (10 emit)           $cr
-
-  ; recursion via y-combinator
-  ($f ($x (^x x) f) dup force) $Y ($g (^g Y)) $rec
+  (dup car swap cdr)  $carcdr
 
   ; if-stmt
   ($c $t $f c ^f ^t rot cswap $_ force) $if
   ($f $t $c $fn ^f ^t ^c fn)     $endif
 
   ; range
-  ($self $body $start $end
-    ^if (^start ^end eq) nil
-      (^start body ^end ^start 1 + ^body self)
+  ($self $start $end
+    ^if (^start ^end eq)
+      ^nil
+      (^start ^end ^start 1 + self swap cons)
+    endif
+  ) $range
+
+  ($self $func $list
+    ^if (^list null?)
+      nil
+      (^list carcdr swap func ^func self)
     endif
-  ) rec $do
+  ) $foreach
 
-  70 65 ^emit do cr
+  58 48 range
+  ^emit foreach cr
 )