libera/#lisp - IRC Chatlog
Search
8:39:17
JohnMS_WORK
Good morning. I'm trying to modify a value in a list during a for loop, but it's not being updated. What is wrong with my approach? https://pastebin.com/pZqch6i6
8:54:14
splittist
If you're going to use a list to hold the values, then (a) probably don't use a literal list and (b) you might look at SETF of ELT.
8:56:17
splittist
I, who only deal with comparatively short lists, would probably calculate the totals and use SORT.
8:58:00
aeth
JohnMS_WORK: you don't set elements of '(1 2 3) in Common Lisp because it's a literal... that's the difference between '(1 2 3) and (list 1 2 3)
8:58:52
aeth
and thus inline it into the program where mutation will cause weird things if it even lets you do it since now a lot of them check
8:59:51
splittist
The list '(0 0 0) is literal. Perhaps not a great problem in this case, but something like (list 0 0 0) or (make-list 3 :initial-element 0) might be better. In the latter case, depending on your logic, you could easily make it a TOP-N function.
9:02:17
JohnMS_WORK
So I should do: (let ((highest (list 0 0 0)) (sum 0))) instead for creating the highest list.
9:12:58
splittist
One approach: (subseq (sort (mapcar (lambda (entry) (apply '+ entry)) *cals*) '>) 0 3)
10:57:49
pjb
splittist: better use (reduce #'+ caloric-items) rather than apply. APPLY may be limited by CALL-ARGUMENTS-LIMIT on the length of the list, and needs a list. REDUCE only needs a sequence, and has no limit.
10:59:42
pjb
for highest, I would use a vector, and shift the elements after a dichotomy. Or use MERGE instead of SORT since the list is already sorted. (SORT might not be the fastest on sorted lists, we could be O(n), but SORT may still be O(nlogn)).
11:51:16
splittist
(with a COERCE HIGHEST 'LIST in place of HIGHEST in the DOLIST if JohnMS_WORK needs a list)
11:52:49
JohnMS_WORK
I'm trying to learn to work with lists and LISP. So need is a strong word there. :)
11:59:08
splittist
JohnMS_WORK: So we start with a sequence of zeros, which is already sorted with lowest first. For each element of the calories list we compute the sum. If the sum is higher than the first entry in the sequence (which is the lowest), we save a new sequence made up of the original elements of the sequence less the lowest, with the new sum. In my list version, we do that by POPing off the first (lowest) element of the list, PUSHING the
11:59:08
splittist
new sum onto the list, then sorting it. In pjb's version we do that by MERGEing two sequences, one of which is just the sum, and the other of which is the array except its first element (the SUBSEQ from 0)
12:02:08
splittist
(We tell the DOLIST form to return HIGHEST by specifying it as the third argument.)
12:07:13
splittist
JohnMS_WORK: you'd be way better off using the (hyper)spec. If you put 'clhs dolist' into your search you'll get something like http://clhs.lisp.se/Body/m_dolist.htm
12:16:54
splittist
JohnMS_WORK: btw, while the spec allows call-arguments-limit to be as low as 50, on the old sbcl I'm playing with it's 4,611,686,018,427,387,903
13:34:18
JohnMS_WORK
Taking in the feedback you guys have given. I've modified and worked out two solutions: https://pastebin.com/uWLnriNn . Thanks you guys have been very kind and generous.