4 ms·
x = [42, 99] y = x del x[0] y[0] ; 99 This is impossible in traditional Lisp, and it’s the source of many of my frustrations. It’s why you can write an a
by sillysaurusx 3y ago
x = [42, 99]
y = x
del x[0]
y[0] ; 99
This is impossible in traditional Lisp, and it’s the source of many of my frustrations. It’s why you can write an algorithm to destructively modify a list at any point — except index zero. The head of the list is the thing that’s used as a reference to the list. This doesn’t happen in Python; it’s why you can have empty arrays set to x and y, push a value onto x, and see it at y.
- tonyg 3y ago(define (snip! x) (set-car! x (cadr x)) (set-cdr! x (cddr x)) x) ?
- tmtvl 3y agoWon't work, errors on a single-element list. I think the solution would be the same as it is in CL: to just use vectors.
- cess11 3y agoPretty sure you can do this in CL but I'm short on time so I'm not going to figure it out right now. Most of the time I try to get rid of variable names so it seems somewhat strange to invent more than one pointing to the same data structure in RAM, but I'm a simple person that gets confused easily.
- tmtvl 3y agoWith adjustable arrays it's easy: (defun vector-delete! (vector index) "Delete the element at INDEX from the given VECTOR. Destructively modifies the vector. The vector must have a fill-pointer. This is not thread-safe, use at your own risk. Examples: (let* ((x (make-array 4 :fill-pointer 4 :initial-contents '(1 2 3 4))) (y x)) (vector-delete! x 0) y) ;; => #(2 3 4)" (declare (type (Integer 0 *) index) (type Vector vector)) (assert (array-has-fill-pointer-p vector)) (let ((l (length vector))) (assert (< index l)) (let ((removed-element (aref vector index))) (loop :for i :from (1+ index) :below l :do (setf (aref vector (1- i)) (aref vector i))) (decf (fill-pointer vector)) removed-element))) (Granted, it could be done in 6 lines of code, but I'm already cringing at not providing a continuation when calling it with an out-of-bounds index)
- jimbokun 3y agoI see what you mean. I think there is less confusion about this kind of thing with Clojure, where a preference for immutable persistent data structures is strongly stated in the language design. So the persistent nature of lists and other data structures is fore grounded, and there is no confusion over why the equivalent of "del x[0]" is not supported.