Homoiconicity: Code Is Data
Homoiconic means a language's code is represented in its own primary data structure. In Lisp, a program is a list, so programs can construct, inspect, and transform programs easily.
This is what makes macros, metacircular evaluators, code walkers, and DSLs natural in Lisp.
(define code '(+ 1 2 3))
(car code) ; + : the operator symbol
(cdr code) ; (1 2 3) : the arguments
(eval code (interaction-environment)) ; 6
;; Build code programmatically
(define (make-sum-expr nums) (cons '+ nums))
(eval (make-sum-expr '(10 20 30)) (interaction-environment)) ; 60
;; Transform code: swap + for *
(define (plus->times expr)
(cond ((eq? expr '+) '*)
((pair? expr) (map plus->times expr))
(else expr)))
(plus->times '(+ 2 (+ 3 4))) ; (* 2 (* 3 4))