GNU Emacs Lisp は、様々な制御構造を提供しています。これには (progn のように) シーケンスを作るフォーム、 (if のように) ある条件が満たされた時にのみ評価を行 なわせるフォーム、繰り返しを指示するフォーム (while) 、コードからの non-local exit を行なうフォーム (throw) が存在します。
いくつかの制御構造 (e.g., if) は、implicit progn (と呼ばれるもの)を提供し、そ の各要素を順番に評価するフォームのリストを用いることができるようにします。例え ば、以下の 2つのフォームは、一方は progn を用い他方は用いていませんが(全く)同 じ働きをします。
(if test-form then-form (progn else-form1 else-form2)) == (if test-form then-form else-form1 else-form2)