Given that the name of the language we're using, Lisp, stands for LIST Processing, one might assume that the language has facilities for handling lists of items, and you'd be correct!
While Common Lisp has data structures other than lists, lists are still heavily used.
A list in Common Lisp is a sequence of items. It's also called a cons (for historical reasons, mostly).
The items themselves do not have to be the same type.
For example you can have a list of 1, two, "III".
You can simply type in a quoted list like this: '(1 two "III") and that will cause a list to be created and evaluated (it evaluates to (1 two "III")).
There are also two main functions used to create lists: list and cons.
list takes zero or more arguments and evaluates to a list created with those values:
(list 1 'two "III") ; => (1 two "III")
cons takes two items and creates a list which has the first item as its car (the list head) and the second item as its cdr (the rest of the list):
(cons 1 2) ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil) ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)
The functions car and cdr can be used to access the car and cdr of a list.
(first and rest are synonyms of car and cdr and work exactly the same.)
The length of a list can be determined by the use of length.
An empty list has length zero.
An arbitrary item can be accessed with nth (note that lists are zero-indexed).
It is not an error to request an index that is bigger than the list is long.
Instead, it evaluates to nil:
(nth 23 '(short list)) ; => nil
There are also several helper methods for accessing the first items of a list: first, second, third, all the way until tenth. Nifty, huh?
Two or more lists can be combined with append:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
Each argument given to append needs to be a list.
Leslie the Lisp Alien needs to do some shopping. It is very important to have a shopping list. One needs to add things to it, and remove things from it.
Of course simple pen and paper will not do for a Lisp Alien. "List" is most of the word "Lisp" even!. There must be some functions written to help keep track of the shopping.
Can you help Leslie keep track of the shopping list?
First thing is that Leslie needs to create a empty list. A function called new-list would be perfect for that.
(new-list) ; => ()
Oh no... Leslie has a few things in mind already, so they need a function that takes three items (luckily Leslie only creates a list of three items. Nothing more, nothing less!) and creates a new shopping list with those things. Write a function, list-of-things which takes three items and returns a list of them.
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
Before going to the store Leslie looks in the pantry to see what they need. Help them by writing the function add-to-list which adds an item to the beginning of a list.
(add-to-list 'butter '(bread)) ; => '(butter bread)
When shopping, Leslie wants to know what to look for next. They also like to peek ahead at the list to see the second, third, or even the 23rd item (their lucky number).
first-thing will evaluate to the first thing on the listsecond-thing will evaluate to the second thingthird-thing will evaluate to the third thingtwenty-third-thing will evaluate to the twenty-third thing(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Leslie wants to find the first item of the list and remove the it from the shelf.
Help them out by writing a function remove-first-item which evaluates to a list with everything but the first item on the input list.
(remove-first-item '(bread butter milk)) ; => '(butter milk)
Leslie realized they accidentally made two shopping lists, not one! Write a function, list-append which returns a list that with the elements from the first list followed by the ones from the second list.
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
Leslie is getting worried that this shopping trip will take a while. Just how many things are on this list? Write a function just-how-long to tell them how long their list is.
(just-how-long '(bread milk butter salt)) ; => 4
Sign up to Exercism to learn and master Common Lisp with 27 concepts92 exercises, and real human mentoring, all for free.