Version 2.7 updates uLisp to use Lexical Scoping, like current dialects of Lisp including Common Lisp and Scheme. Previously uLisp used Dynamic Scoping, like older dialects of Lisp.

ELI5: Lexical Scoping is preferred because it avoids the possibility of obscure errors due to parameter name clashes; perhaps someone can explain it better than this.

Here’s a simple test that detects which type of scoping a Lisp is using:

(let ((lex nil)) (funcall (let ((lex t)) (lambda () (if lex 'lex 'dyn)))))

It returns lex if the Lisp uses Lexical Scoping and dyn if it uses Dynamic Scoping.

To download the latest version see: Download uLisp.