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.
Post Reply
andrewcmunroe
Posts: 1
Joined: Fri Nov 09, 2018 9:54 am

Add 1 to the middle element of a list

Post by andrewcmunroe » Fri Nov 09, 2018 10:12 am

Hi. Can I please get some help?

"Write a function MID-ADD1 that adds 1 to the middle element of a
three-element list.
For example, (MID-ADD1 ’(TAKE 2
COOKIES)) should return the list (TAKE 3 COOKIES). Note: You
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

Post by nuntius » Sat Nov 10, 2018 3:21 pm

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

Post by sylwester » Sun Nov 11, 2018 7:20 am

The clearest would be to

Code: Select all

(defun mid-add1 (list)
  "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

(defun mid-add1 (list)
  "Adds 1 to the middle element of a
three-element list."
  (assert (and (listp list) 
                    (= (length list) 3)
                    (numberp (second list)))  (list) "~a must be a 3 element list with the second element being numeric" list)
  (list (first list) (1+ (second list)) (third list)))
I'm the author of two useless languages that uses BF as target machine.
Currently I'm planning a Scheme compiler :p

Post Reply