freenode/#lisp - IRC Chatlog
Search
17:25:04
pjb
(define-modify-macro deletef (item &rest keys) item-delete "Delete the item from the sequence in PLACE.")
17:26:54
pjb
(setf *print-circle* t) (let* ((list (list 1 2 3)) (original list)) (deletef list 1) (list original list)) -> ((1 . #1=(2 3)) #1#)
17:28:50
tempate
Would it be a more lispy solution to just remove the item from a copy of the list and return both the new list and the chosen element?
17:28:51
pjb
Of course, you could write your own delete function that would mutate it. For example, it could put a NIL in the CDR of the first CONS cell.
17:29:47
pjb
tempate: don't think lisp. Think what should my program do so you can sell it for a billion and finance whatever you want (Venus exploration, development of a Lisp OS, a Pacific Island, whatever).
17:32:27
pjb
tempate: well, for your goal function, you have to choices. Either you want to use lisp lists, which don't exist as an ADT, but are merely chains of cons cells, and then you will have to return indeed two values, the extracted element and the new list, or you introduce your own list ADT (eg. a class or a structure that wraps a lisp list), and then you can mutate the list and only return the extracted element.
17:32:59
pjb
tempate: in any case, since the list can be empty, you could have no element to return, so returning multiple values including an indicator that the list was empty should be envisaged.
17:35:14
Nilby
pjb: Yes. That's the elegant way. But wouldn't tell someone who's unfamiliar with delete to do it that way at first.
17:35:37
pjb
tempate: an alternative, is to pass a "place" to your function. If you write a macro, you must mind using get-setf-expansion. But you can pass a place to a function by way of a closure.
17:36:08
tempate
pjb: I think I'm going to write a class. It'll most likely come in handy in the future.