I’m working on a Scheme assignment for school and there’s a question involving us defining a record “type” (implemented as a list) (which represents a music record).
The question I’m having trouble with is I’m asked to create a procedure which creates a list of these records, and then a function to add a record to this list. This is pretty simple, but I feel like I might be doing something wrong.
I know how to append an element to a list (i.e. the record shelf in this example), but I’m not sure how to properly maintain this list across invocations of this add function. Here’s what I’ve got:
(define (add-record record lst)
(append lst (list record)))
Which works as I’d expect, but my problem is when I invoke this procedure.
(define record-self '())
Was my first attempt, but of course every time I add a record with the add-record procedure, passing in that just-defined record-shelf list, well, my add function returns a brand new list (i.e. a copy, with the appended record). This makes sense, but I’m not sure if that’s what I want.
So if I wanted to add a bunch of records to the list like so:
(add-record highway61 record-shelf)
(add-record sgtPepper record-shelf)
Of course it doesn’t result in what I want, because record-shelf doesn’t get updated. And I don’t think at this point in the course we’re supposed to use set! or assignments.
Should I just be grabbing a copy of the returned list (from add-record) every time, and then use that returned list in the next invocation?
You are wishing for stateful behavior. As Enrique says, the answer to your last question is Yes.
Is there a reason you can’t just
consthe new record onto the head of the list? That is the idiomatic way to add items to a list in Lisp. Or in any functional language that uses singly linked lists.There is no way to make
record-shelfcontain a new item after you invokeadd-recordwithout usingset!in some form.