کاهش یعنی اعمال مکرر یک تابع روی هر عنصر از یک دنباله و انباشتن نتایج، به شکلی خاص. تابعی که اعمال میشود دو پارامتر میگیرد: مقدار انباشتهی کنونی و عنصری که باید پردازش شود. نتیجهی آن باید مقدار انباشتهی جدید باشد.
در Common Lisp این کار با تابع reduce انجام میشود.
در سادهترین شکلش چنین است:
(reduce #'function-to-apply sequence :initial-value value)
توجه کنید که یک مقدار اولیه داده میشود؛ این همان «مقدار انباشتهی کنونی» است که هنگام پردازش اولین عنصر به تابع داده میشود.
این مثالی است که اعداد فهرست را با شروع از مقدار اولیهی ۱۰ با هم جمع میکند:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
در نظر داشته باشید که اگر دنباله خالی باشد، تابع هرگز فراخوانی نمیشود و این فرم به مقدار اولیه ارزیابی میشود.
لوگان، فضاییِ Lisp، عددها را دوست دارد و از مرتب کردن هم خوشش میآید.
او از شما میخواهد به او کمک کنید تابعی بنویسد که فهرستی از عددها را بگیرد و جفتی از دو فهرست تولید کند: فهرست اول همهی عددهای فرد است و فهرست دوم همهی عددهای زوج.
اول باید تابعی بسازید که یک جفت از دو فهرست و یک عدد را بگیرد و آن عدد را بسته به اینکه فرد است یا زوج، در زیرفهرست درست قرار دهد:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
حالا با استفاده از تابعی که همین الان ساختید، میتوانید تابع دیگری بنویسید که فهرستی از عددها را بگیرد و آنها را مانند بالا دستهبندی کند:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
در Exercism ثبتنام کنید تا Common Lisp را همراه با 27 مفهوم92 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.