## Add 1 to the middle element of a list

You have problems, and we're glad to hear them. Explain the problem, what you have tried, and where you got stuck.
Feel free to share a little info on yourself and the course.
Forum rules
Please respect your teacher's guidelines. Homework is a learning tool. If we just post answers, we aren't actually helping. When you post questions, be sure to show what you have tried or what you don't understand.
andrewcmunroe
Posts: 1
Joined: Fri Nov 09, 2018 9:54 am

### Add 1 to the middle element of a list

Hi. Can I please get some help?

"Write a function MID-ADD1 that adds 1 to the middle element of a
three-element list.
are not allowed to make MID-ADD1 a function of three inputs. It
has to take a single input that is a list of three elements."

Here's what I came up with:
(defun mid-add1 (l) (+ 1 (car (cdr l))))

This only returns the modified element. How can I get the modified list?

nuntius
Posts: 538
Joined: Sat Aug 09, 2008 10:44 am
Location: Newton, MA

### Re: Add 1 to the middle element of a list

Construct a new list. Include the original head, new middle, and original tail.

There are ways to destructively modify the middle value in the original list (setf ...), but I think the new list is what your instructor is looking for.
If done right, the amount of code is about the same either way.

sylwester
Posts: 133
Joined: Mon Jul 11, 2011 2:53 pm

### Re: Add 1 to the middle element of a list

The clearest would be to

Code: Select all

"Adds 1 to the middle element of a
three-element list."
(assert (and (listp list) (= (length list) 3))  (list) "~a must be a 3 element list" list)
(destructuring-bind (first-element mid-num third-element) list
(assert (numberp mid-num) (list mid-num) "The second element of ~a must be a number. Got ~a" list mid-num)
(list first-element (1+ mid-num) third-element)))
Of course you can just use accessors:

Code: Select all