You can doubt that. But I have done it. I know that it works.
CL-USER 63 > (defun foo (a) (print 'hey) (print a))
FOO
CL-USER 64 > (foo 'jack)
HEY
JACK
JACK
CL-USER 65 > (function-lambda-expression 'foo)
(LAMBDA (A) (DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 81D03EFF03>)) (DECLARE (LAMBDA-NAME FOO)) (PRINT (QUOTE HEY)) (PRINT A))
NIL
FOO
CL-USER 66 > (fifth *)
(PRINT (QUOTE HEY))
CL-USER 67 > (setf (fifth (function-lambda-expression 'foo)) '(print 'hello))
(PRINT (QUOTE HELLO))
CL-USER 68 > (foo 'jack)
HELLO
JACK
JACK
> E.g. both CLISP and guile error out if I try `(car (lambda (a b) (+ a b)))`.Sure, but in CLISP the function is still a list internally. An interpreted function is a record, which stores the code as a list internally. The internally stored list is interpreted.
Python compiles the code to byte code. CLISP has both a list-based interpreter and a byte code interpreter.