Lisp - Using mapc on List
mapc is similar LISP function as mapcar function. It applies the provided function on each element of the list but with a major difference of side-effect. mapcar function applies the function on the elements on original list and returns a new list without modifying the original list wherease mapc modifies each element and doesn't create a new list. Main purpose of mapc is to alter the original list.
Syntax
(mapc function list)
Where
function− a function to be applied on each element of the list. We can create a function using #(function-name) or a lambda (anonymous function).
list− a list to be iterated.
Let's discover usage of mapc function with examples−
Operations on elements of a list
In following example code, we're performing few simple operations on list of numbers and printing them.
Print each element
; print each element (mapc #'print '(1 2 3))
Output
When you execute the code, it returns the following result −
1 2 3
Get sum of each elements
; get sum of elements as a side-effect (print(let ((sum 0))(mapc #'(lambda (x) (setf sum (+ sum x))) '(1 2 3))sum))
Output
When you execute the code, it returns the following result −
6
Using mapc on multiple lists
We can use mapc on mulple lists provided the function should accept as many parameters as there are lists to be iterated. mapc will apply function to each element of the list.
Formatted Printing with multiple lists
; print each element in required format (mapc #'(lambda (x y) (format t "x=~a, y=~a~%" x y)) '(1 2 3) '(10 20 30))
Output
When you execute the code, it returns the following result −
x=1, y=10 x=2, y=20 x=3, y=30
When to use mapc
We can utilize mapc function over mapcar function when
We need to perform a side-effect action using each element of the list.
We're not requiring any new list.
We need to modify external state (like global variable or any output)
Updating a global variable while iterating
Following example shows how to update a global variable while using mapc function.
; define a global variable (defvar counter 0) ; iterate over list element (mapc #'(lambda (x) (incf counter x)) '(1 2 3)) ; print the counter (print counter)
Output
When you execute the code, it returns the following result −
6