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
Advertisements