Clojure برای شجاع و واقعی

به عنوان یک توسعه دهنده برای چند سال ، من تصمیم گرفتم که از طریق Clojure از کنجکاوی خالص به دنیای Lisp شیرجه بزنم. و اینگونه کتاب را پیدا کردم “Clojure برای شجاع و واقعی”توسط دانیل هیگینبوتام. اولین چیزی که توجه من را به خود جلب کرد ، لحن آرام و مقرون به صرفه نویسنده بود که می تواند مفاهیم پیچیده ای را در چیزی قابل هضم و غالباً خنده دار بسازد. اما آیا این کتاب فقط سرگرم کننده است ، یا واقعاً محتوای با کیفیت را ارائه می دهد؟ بیایید نگاه کنیم
چه چیزی خوب کار می کند
این کتاب با یک مقدمه سبک و طنز شروع می شود ، اما اشتباه نکنید: به سرعت در مفاهیم عمیق فرو می رود. Higginbotham استعداد ویژه ای برای توضیح ایده های پیچیده دارد. به عنوان مثال ، این مفهوم را معرفی می کند برنامه نویسی عملکردی با مثالهای عملی که نشان می دهد چگونه Clojure با عملکرد ناپذیری و کارکردهای درجه یک می خواند.
(defn inc-maker [inc-by]
#(+ % inc-by))
(def inc3 (inc-maker 3))
(inc3 7) ; => 10
در اینجا ، نویسنده نه تنها توضیح می دهد که چگونه توابعی را ایجاد می کند که سایر کارکردها را برگرداند (بسته شدن) ، اما همچنین نشان می دهد که چگونه این می تواند در موقعیت های واقعی مفید باشد. این کاری است که بسیاری از کتابهای فنی قادر به انجام آن نیستند: نظریه را به تمرین متصل کنید.
یکی از نقاط قوت کتاب تأکید بر برنامه برای انتزاع، نه برای پیاده سازی ها. این چیزی است که به عنوان یک توسعه دهنده از عمیق قدردانی می کند. نویسنده توضیح می دهد که چگونه Clojure با لیست ها ، بردارها ، مجموعه ها و نقشه ها به عنوان توالی رفتار می کند و به شما امکان می دهد از توابع استفاده کنید map
با reduce
اشمیه filter
به طور مداوم ، صرف نظر از ساختار داده.
(map inc [1 2 3]) ; => (2 3 4)
(map inc #{1 2 3}) ; => (2 3 4)
این قوام یکی از دلایلی است که Clojure بسیار قدرتمند است و کتاب کار بسیار خوبی را برای برجسته کردن آن انجام می دهد. یکی از بهترین فصل های نوشته شده کتاب ، هنر مقدس برنامه نویسی همزمان و موازی است.
بر خلاف سایر کتابهای مقدماتی که برنامه نویسی رقیب را به صورت سطحی بازی می کنند ، Higginbotham واقعاً مفاهیم را عمیق تر می کند ، توضیحات روشنی و نمونه های عملی را ارائه می دهد atoms
با refs
با agents
اشمیه core.async
بشر
این کتاب همچنین توضیح خوبی در مورد چگونگی جلوگیری از شرایط رقابت و همگام سازی عملیات رقیب به طور مؤثر ارائه می دهد. پوشش Core.Async به ویژه مفید است زیرا آموزش نحوه ساخت برنامه های رقیب را به روشی زیبا و مقیاس پذیر می آموزد. این کتاب مملو از نمونه های عملی است که به تقویت یادگیری کمک می کند.
یکی از موارد مورد علاقه من نمونه است “خشونت هابیت”جایی که نویسنده تابعی را برای شبیه سازی حملات به هابیت ایجاد می کند ، به طور تصادفی یک قسمت بدن را برای رسیدن به آن انتخاب می کند. این ممکن است احمقانه به نظر برسد ، اما این یک روش مؤثر برای آموزش مفاهیمی مانند بازگشت است ، سکانس های تنبل و دستکاری نقشه
(defn hit [asym-body-parts]
(let [sym-parts (better-symmetrize-body-parts asym-body-parts)
body-part-size-sum (reduce + (map :size sym-parts))
target (rand body-part-size-sum)]
(loop [[part & remaining] sym-parts
accumulated-size (:size part)]
(if (> accumulated-size target)
part
(recur remaining (+ accumulated-size (:size (first remaining))))))))
این مثال نه تنها سرگرم کننده است ، بلکه نشان می دهد که چگونه می توان از Clojure برای حل مشکلات ظریف و مختصر استفاده کرد.
چه چیزی می تواند بهتر باشد
اگرچه این کتاب برای مبتدیان بسیار عالی است ، اما می تواند برای توسعه دهندگان با تجربه تر که از قبل با مفاهیم برنامه نویسی عملکردی آشنا هستند ، مورد نظر باشد. مباحث مانند ماکرو اشمیه Metaprogramaço به آنها نزدیک می شوند ، اما از نظر سطحی. به عنوان مثال ، فصل ماکرو می تواند به جای اینکه فقط اصول اولیه را نشان دهد ، چگونه می توان ماکروهای پیچیده و ایمن را ایجاد کرد.
(defmacro unless [test & body]
`(if (not ~test)
(do ~@body)))
(unless false (println "This will print!"))
در حالی که مثال بالا مفید است ، فراتر از آنچه در یک مستندات اساسی پیدا می کنید فراتر نمی رود. این کتاب تقریباً منحصراً روی خود زبان Clojure متمرکز است ، اما زمان زیادی را به اکوسیستم اطراف آن اختصاص نمی دهد. پوششبا کلوچه نسخه، یا کتابخانه های محبوببشر برای کسی که شروع می کند ، درک نحوه مدیریت وابستگی ها و ساختن پروژه ها به همان اندازه زبان یادگیری مهم است.
بخش موضوعات پیشرفته کتاب مفاهیمی مانند مبدل ها ، چند متد و پروتکل ها را ارائه می دهد که ممکن است برای توسعه دهندگان با تجربه تر مفید باشد. مشکل این است که این توضیحات نسبتاً کوتاه هستند و به تفصیل برنامه های عملی یا پیامدهای طراحی را کشف نمی کنند.
تمرینات در پایان هر فصل مفید است ، اما بسیاری از آنها بسیار ساده هستند. برای توسعه دهندگان باتجربه ، دیدن مشکلات پیچیده تری که نیاز به ترکیبی از مفاهیم آموخته شده در طول کتاب دارند ، جالب خواهد بود.
ارزشش را دارد؟
این به تجربه شما در زبان و الگوی عملکردی بستگی دارد. اگر مبتدی هستید و به دنبال خواندن آرام تر هستید ، این کتاب برای شما مناسب است. برای کسانی که می خواهند درک عمیقی از زبان داشته باشند ، به ویژه در جنبه هایی مانند ماکرو و رقابت ، این کتاب می تواند ناامید کننده باشد. برای کسانی که قبلاً در زبان های کاربردی دیگر تجربه دارند یا حتی لیسپ ، لحن آرام و کمبود عمق می توانند مانعی باشند.
اگر به دنبال چیزی محکم تر هستید ، توصیه می کنم برنامه نویسی از chas emerick یا شادی Clojure از Fogus و Houser (دو کتاب عالی که من هنوز هم می خواهم در آینده تجزیه و تحلیل انجام دهم). در پایان ، این به هدف شما بستگی دارد: اگر فقط می خواهید کمی با Clojure بازی کنید ، Clojure برای شجاع و واقعی این یک خواندن سبک و سرگرم کننده است. اما اگر می خواهید یک پایگاه جدی برای ساختن برنامه های واقعی داشته باشید ، بهتر به دنبال منابع دیگر باشید. در یادداشتی از 0 تا 10 ، این کتاب 6 را به این کتاب می دهد.