Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
87 lines (67 sloc) 2.79 KB


(scm2cl is part of the scmxlate distribution.)

scm2cl is a Common Lisp program that converts Scheme code to Common Lisp. Its goal is to remove the tedium of transcribing a large Scheme file into CL, not to avoid human intervention altogether. You may have to do some hand-tuning — scm2cl will assist you here too.

scm2cl understands R5RS Scheme, including the high-level macros (define-syntax, let-syntax, and letrec-syntax), plus some common Scheme extensions, viz, andmap, append!, call-with-input-string, call-with-output-string, delete-file, exit, file-exists?, fluid-let, flush-output, getenv, get-output-string, open-input-string, open-output-string, ormap, read-line, reverse!, string-index, string-reverse-index, system.


With some Common Lisp dialects, you can call on the operating-system command-line, with the Scheme file to be converted as argument: scmfile.scm

This produces the CL file in

If this is not possible, you may load into your Common Lisp and invoke the function scheme-to-cl. Eg,

(load "")
(scheme-to-cl "scmfile.scm")

Human Intervention

funcall and function

scm2cl is good at inserting funcall and function (aka #’) where needed, but not perfect. It will, however, draw your attention to code locations where a funcall may be needed. scm2cl will not miss any of these problem spots, so you don’t have to hunt for funcall locations on your own.

No similar signaling is offered for potential #’ locations. (The reason is that this would lead to too many signals for #’, the vast majority of them being red herrings. Detecting funcall is less noisy, but still not perfect --- which is why scm2cl suggests passively instead of inserting actively.)

Some additional definitions

The CL file produced by scm2cl may use some of the procedures defined in the file ( contains some Scheme-like procedure definitions for CL.) At the end of the conversion, scm2cl will give you the exact list of Scheme procedures from actually used. You will need to incorporate these procedure definitions into the converted code. How you do it is up to your convenience.


Only “escape” continuations are allowed for call-with-current-continuation.

“Named” lets whose names begin with the substring "loop" are converted into iterative CL loops. scm2cl assumes that such named lets were intended to write iterative (“tail-recursive”) loops, and translates accordingly. This will cause error if the let wasn’t so intended.

Named lets with names that do not begin with loop are converted using CL labels.