Clojure یک lisp هست به نظر من جمله غلطیه.
Lisp و ML و Haskell و Clojure و Racket و Ruby و Scala و F# و .... همشون Functional Programming Language هستن.
Clojure یک گویش از خانواده زبانهای Lisp هست. Lisp در قدیم یک زبان برنامه نویسی یکتا بود که بهش میگفتن Lisp 1.5، ولی بعدتر زبانهای مشابه با ساختار مشابهی پدید اومدن. درحال حاضر زبانهای Common Lisp، Scheme و Clojure پرکاربردترین زیر شاخه های Lisp هستن.
تفاوت بین Clojure و دو زبان Common Lisp و Scheme اینه که Clojure روی JVM اجرا میشه، و یک کامپایل مشخص داره، درحالی که Common Lisp و Scheme فقط Standard هستن و کامپایلرهای متنوعی برای اینها وجود داره، از جمله Racket و Chicken و GNU Guile برای Scheme، و CLISP و SBCL و EmacsLisp (که مورد آخر زبان Scripting برنامه Emacs هستش). Lisp ها به طور عجیبی متنوع و زیادن، و همچنین ناسازگار باهم. برای همین خیلی سخت میتونن از Library های همدیگه استفاده کنن. Clojure با توجه به اینکه روی JVM اجرا میشه، ساختار یکپارچه تری نسبت به بقیه Lisp ها داره، و همچنین به توابعی که برای Java نوشته میشن، دسترسی داره.
یکی از خصوصیات مهم زبانهای خانواده Lisp، که شامل Clojure هم میشه، ساده بودن ساختار خود زبانه. Lisp در کل زبان ساده ای نیست، ولی همه چی یک شکل کار میکنه و Syntax عجیب غریب بهش اضافه نمیشه. یادمه قدیم که ++C میخوندم، وقتی خواستم وارد 14++C شم، انقد گیج شدم که کلا این زبان رو گذاشتم کنار، بیشتر فلسفی میشه تا کاربردی.
خصوصیت مهم بعدی، داشتن Macro های بسیار قویه. اینگونه که به زبان Lisp میگن "lisp is a programmable programming language"، چون بسیار منعطفه، و ساختار هایی که درون این زبان وجود نداره رو به راحتی میشه ساخت و مورد استفاده قرار داد. به هیچ وجه محدود نیستید.
نکته مهم بعدی، Dynamic typing بودنشه، که لازم نیست نوع داده هارو توش مشخص کنید. به نظرم نکته مثبتیه. اگه Java کار کرده باشید، متوجه میشید که هفتاد درصد وقتتون رو فقط صرف این میکنید که نوع داده هارو مشخص کنید و به همدیگه تبدیلشون کنید. هرچند تا حدی از وجود باگ جلوگیری میکنه، اما خودش هم نوعی سردرگمی ایجاد میکنه.