A counter in racket-scheme:
#lang typed/racket
(define my-counter!
(let ([t 0])
(lambda ()
(set! t (+ 1 t))
t);lambda
);let
);define
(print (my-counter!))
(print (my-counter!))
A counter in sbcl-lisp:
load "~/quicklisp/setup.lisp")
(declaim (optimize (speed 3) (safety 3)))
(let ((c 0))
(defun my-counter! ()
(lambda ()
(setf c (+ 1 c))
c); lambda
) ;defun
) ;let
(defun main ()
(print (funcall (my-counter!)))
(print (funcall (my-counter!)))
)
(sb-ext:save-lisp-and-die "test.exe" :toplevel #'main :executable t)
Could someone elaborate why i need “funcall” in lisp and not in scheme ? And why the different placing of let ?


You shouldn’t need
funcallin your common lisp code, but the way you defined your function requires it. You havedefunalready defines a function; you don’t need to also wrap the function body in alambda. This definition allows you to avoid thefuncall:Though it’s worth knowing that unlike in scheme, common lisp will return the value after a
setf. There’s also a convenience macro calledincfthat increments variables so you can write the whole thing like this:And your other question: Why the different placing of the let?
In common lisp,
defun,defvar,defparameter,defmacro, … all affect global scope, no matter where they appear. scheme’sdefinedoes not affect global scope; its effects are only visible locally. This means that adefuninside of aletbody still creates a globally accessible function that closes over the variables defined in theletbindings. Scheme, by contrast, needs to have adefineat global level (or at least outside thelet) but the function body still needs to close over theletvariables.