Robert Smith avatar Robert Smith committed da19d39

Initial commit. Seemingly complete RECUR library.

Comments (0)

Files changed (4)

+                                RECUR
+
+               A simple library for Scheme's named LET.
+
+
+RECUR is a simple Lisp alternative Scheme's "named-LET". Scheme allows
+one to iterate like the following:
+
+(define (factorial n)
+  (let fact ((n    n)
+             (prod 1))
+    (if (zero? n)
+        prod
+        (fact (- n 1)
+              (* n prod)))))
+
+This is a useful idiom for Lisp as well. With this library, it is written
+
+(defun factorial (n)
+  (recur fact ((n    n)
+               (prod 1))
+    (if (zerop n)
+        prod
+        (fact (1- n)
+              (* n prod)))))          
+
+This library exports a single macro, RECUR:RECUR, which is a
+replacement for Scheme's named-LET. The only caveat is that tail
+recursion is not strictly supported, though many implementations do
+support it (with some combination of OPTIMIZE declarations).
+;;;; package.lisp
+;;;; Copyright (c) 2012 Robert Smith
+
+(defpackage #:recur
+  (:use #:cl)
+  (:export #:recur))
+
+;;;; recur.asd
+;;;; Copyright (c) 2012 Robert Smith
+
+(asdf:defsystem #:recur
+  :serial t
+  :description "A simple alternative to Scheme's named-LET."
+  :author "Robert Smith <quad@symbo1ics.com>"
+  :license "Public Domain"
+  :components ((:file "package")
+               (:file "recur")))
+
+;;;; recur.lisp
+;;;; Copyright (c) 2012 Robert Smith
+
+(in-package #:recur)
+
+(defmacro recur (name (&rest bindings) &body body)
+  "A macro imitating Scheme's named-LET."
+  (check-type name symbol)
+  (assert (every 'symbolp (mapcar 'first bindings))
+          (bindings)
+          "Tried to bind datum to non-symbol ~S."
+          (find-if-not 'symbolp (mapcar 'first bindings)))
+  `(labels ((,name ,(mapcar 'first bindings)
+              ,@body))
+     (,name ,@(mapcar 'second bindings))))
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.