(lambda (msg)
(if (eq msg 'car) 'hello 'world))
You could get 'hello by applying that function to the 'car symbol, or 'world by applying it to anything else. Wrapping that in another function lets us generalise to any CAR/CDR. (lambda (car-value cdr-value)
(lambda (msg)
(if (eq msg 'car) car-value cdr-value))) (setq cons (lambda (x xs)
(lambda (msg)
(if (eq msg 'car) x xs)))
(setq car (lambda (xs) (xs 'car)))
(setq cdr (lambda (xs) (xs 'cdr)))
That only uses 'setq, 'lambda, 'if, 'eq, and quoted symbols. That pretty much gives you the untyped lambda calculus, plus some side effects. Throw in the appropriate macros and you've got the core of Scheme and Arc, without any I/O or efficient data representations.
On the FP side of things, I'd _very_ highly recommend "The Structure and Interpretation of Computer Programs," by Abelson and Sussman.