libera/#lisp - IRC Chatlog
Search
11:59:20
JohnMS_WORK
Would anyone be interested in offering feedback to my solution here: https://pastebin.com/KHRxWSnw . I already know it calculates the correct answer. It's just more about learning what normal LISP code would look like and approach the problem.
12:08:37
mariari
JohnMS_WORK: your navigate function, can be done with a reduce, and without any setf/setq's
12:08:50
mariari
also please let the paren's hug each other, they get lonely being on their own lines
12:10:47
JohnMS_WORK
mariari: Interesting, I didn't see how I could be accomplished with reduce nor setf/setq's.
12:11:59
mariari
JohnMS_WORK: reduce lets you fold some values as you go over the list, which replaced the loop. from here You'd carry a 3 list I guess of pos depth and aim you give back, and the folding would simply calculate the new value at each instruction
12:15:23
mariari
yes, though with the reduce you'd just exact those 2 items from the return if you chose to use that
12:16:44
JohnMS_WORK
And the body of the lamdba could be moved to a function where I apply reduce to it, correct? But how would the position and depth variables be updated during the application of reduce?
12:18:01
mariari
the last value in the lambda is returned, this can be your 3 tuple of values you wish to carry over
12:18:44
mariari
for example (reduce (lambda (acc x) (+ x acc)) '(1 2 3) :initial-value 0) acc will be 0 1 3 then 6
12:23:35
neirac
dbotton I tried (create-a obj :link "mylink" :content "mylink") but the result is not clickable I'm missing something else?
12:31:04
splittist
JohnMS_WORK: In terms of style, I would not expect to see camelCaase but rather kebab-case; no parens on their own lines; and if you are initializing something to the empty list, use '() rather than nil (to communicate your intent).
12:32:43
moon-child
hmm you know what would be neat? If you could return multiple values from a reduce fn and have them spliced into the argument list
12:33:58
splittist
JohnMS_WORK: they are. But by using '() you're telling the reader (not the compiler, the human) that the vrbl is meant to be a list. NIL would indicate something like a boolean that you're going to check later
12:35:03
splittist
JohnMS_WORK: the DO in the LOOP takes multiple forms (and should probably be at the beginning of the line).
12:36:00
neirac
dbotton I'm sorry that worked, seems my css made it not clickable after removing it, the link started to work.
12:37:23
splittist
JohnMS_WORK: you could even replace the DO part with COLLECTING (list direction movement) . Since it is the only collection in the loop, it will be returned when the loop finishes.
12:39:51
moon-child
it makes more sense in s7 scheme, because multiple values are spliced into arglists in general there--i don
12:40:59
mariari
moon-child: the mvfold splices it into the argument list, let me get you an example
12:41:21
splittist
JohnMS_WORK: If your instruction stream is going to be fed to functions like navigate that are going to just deconstruct each instruction and dispatch on the command, you could even turn the instruction into a symbol (say by INTERNing it) in read-instructions so you can use a CASE instead of a COND.
12:42:29
mariari
https://ghostbin.lain.la/paste/s5bd8 moon-child I was pattern matching in this code, so this is one case from it
12:42:54
splittist
JohnMS_WORK: It is quite common for people to prefer to use SETF instead of SETQ, even for symbols. (There are some who disagree.)
13:20:25
JohnMS_WORK
So the (command . amount) on line 14 performs the split I was doing in mine correct?
13:21:50
splittist
Yeah. LOOP can destructure like that. If I had stuck with your (proper) lists instead of using CONS in the read function, you could say LOOP FOR (COMMAND AMOUNT) IN ....
13:29:56
splittist
If you end up with more complicated types of commands (with varying number of parameters, say), you could look at a matching library like Trivia to do COND+destructuring. (https://github.com/guicho271828/trivia/wiki/What-is-pattern-matching%3F-Benefits%3F) . Using a parenthesized input format could help, too (:
16:36:25
pjb
JohnMS_WORK: yes, () '() nil and '() evaluate to the same thing. But for the human reader, they have different connotation.
16:36:25
pjb
You will avoid to evaluate (), and use it only in non-evaluated places, such as parameter lists (lambda () 'hi), or empty bindings (let () (foo)).
16:36:28
pjb
You will use 'nil when you want to return specifically the symbol NIL. (defun nil-symbol () 'nil)
16:37:33
pjb
JohnMS_WORK: you could use different functions to test them: ENDP for empty list, NOT for boolean false, NULL for symbol nil.
16:38:28
pjb
JohnMS_WORK: and of course, you would use list list* append, etc list operator on '(), and, or, and other boolean operators on nil, and symbol-name, symbol-value, etc, on symbol 'nil.