'mapcar' is the next thing I need to understand
This codeblock (below) is a complete AutoLisp program. Load it into a running instance of AutoCAD and issue the command DOAMAPCAR. Nothing will happen on the screen, but you will see quite a bit of output into the console.
The comments in the code combined with the output in the console window tell you lots of stuff.
The Code
;; WORKING_mapcar.lsp
;; What is mapcar, and what is it good for?
;; Gregory A Sanders, Fall, 2022
;;
;; This exercise uses:
;; defun
;; setq
;; mapcar
;; append
;; print
;; "\n" - (new line)
;; princ
;; strcat
;; itoa
;;
;; mapcar generates a list.
;; mapcar requires a minimum of two arguments (options).
;; The first argument is the name of the function that will crunch one or more lists.
;; The second argument is the list that the function will crunch.
;; If there are more lists that the function should crunch, they are added as subsequent arguments.
;; The number of arguments given to 'mapcar' must equal the number of arguments the function requires.
;; The arguments must also be the right type. Don't send a list of lists to a function that expects a single value.
;; 'mapcar' just makes a list of the function's output, it does not operate on the arguments itself.
;;
;; So the command looks something like this:
;;
;; (mapcar function list1 list2 list3)
;;
(defun c:doamapcar ( / list1 list2 list3) ; Our main function definition with lists as local variables.
; Define the internal function that our mapcar will run
(defun add7ThenMultBy2 (invar) ; 'invar' is a supplied value. 'mapcar' will get it from a list.
(setq invar (+ 7 invar)) ; Add 7 to the supplied value.
; Show invar on console on a new line.
; Use 'strcat' to concatenate space delimited strings into
; one string. print and princ can only handle one string.
(princ (strcat "\n" (itoa (- invar 7)) " + 7 = " (itoa invar)))
; 'itoa' turns an integer into a string (alpha).
(setq invar (* 2 invar)) ; Multiply invar by 2.
(print invar) ; Show this new invar value on a new line.
) ; Close (defun add7ThenMultBy2 .
(princ "\n:: This .lsp demonstrates 'mapcar'.")
(setq list1 (list 10 12 13 14 15)) ; Create list1.
(princ "\nFirst we created list1:")(princ list1) ; On a new line, put the specified string. Then the list.
(setq list1 (mapcar '1+ list1)) ; Add 1 to each value in list1.
(princ "\nNow add 1 to each number using 'mapcar'.")
(princ list1) ; Show list1 on the console without a new line.
(princ "\nCreate list2 using mapcar.\n'mapcar' is like a 'foreach' on list1.")
(princ "\n'mapcar' runs the 'add7ThenMultby2' function on each value in list1.")
(princ "\nAllow me to demonstrate:")
(setq list2 (mapcar 'add7ThenMultBy2 list1)) ; Run each value in list1 through
; the add7ThenMultBy2 function and save it to List2.
(princ "\nHere is our list2: ")(princ list2) ; Show list2 on the console.
(princ "\nUse 'append' to add the contents of list2 to list1.")
(setq list1 (append list1 list2)) ; 'append' puts the contents of list2 into list1 at the end.
(princ "\nThe new list1: ")(princ list1) ; Show us the new list.
(princ "\nUse 'mapcar' again like before.")
(setq list3 (mapcar 'add7ThenMultBy2 list1)) ; Run each value in list1 and list2 through
; the add7ThenMultBy2 function and save it to List3.
(princ "\nHere is our list3: ")(princ list3) ; Show list3 on the console.
(princ) ; End clean on the console by showing nothing.
) ; Close (defun c:doamapcar .
You will get this printout on the console:
Image: If you code it right, the console can help you learn this stuff.
Well, that's it! 'mapcar' has been manipulated and the lightbulb has lit. A Thing That Works!