Lisp has syntax. More than any other programming language.
What you think Lisp syntax is, are really simple function calls like
(+ 1 2)
which are based on the function + various args pattern.But something like Common Lisp has a few dozen syntactic built-in forms. For example the syntax for LET is in an EBNF (extended backus naur form) form:
let ({var | (var [init-form])}*) declaration* form*
Then Lisp has macros. Zillions. Each of them implements syntax.Lisp has a two-stage syntax:
1. stage are s-expressions, a data format: symbols, numbers, lists, strings, ...
2. stage are Lisp forms. They are written as s-expressions. But they have to follow a defined syntax. not every s-expression is a valid Lisp form.
(let ((a 1) (b 2))
(declare (integer a b))
(+ a b))
Above is a valid LET form. (let ((a 1) (b 2))
(+ a b)
(declare (integer a b)))
Above is not a valid LET form, because the syntax requires that the optional declaration is directly after the binding form.Without parentheses it might look like:
let (a 1) (b 2)
declare integer a b
a + b
You would think that it has a syntactic structure. Just because Lisp uses s-expressions as a base mechanism, does not mean Lisp has no syntactic structure - but it is on top of s-expressions.Since Lisp has user-programmable syntax, there is basically an unlimited amount of all kinds of syntactical constructs.