3 ms·
Given the nature of variables and blocks in Logo you can do quite a bit. Like say you want to do a modulo-like operation: IF :SIZE > 100 [MAKE "SIZE :SIZE
by ianbicking 4y ago
Given the nature of variables and blocks in Logo you can do quite a bit. Like say you want to do a modulo-like operation:
IF :SIZE > 100 [MAKE "SIZE :SIZE - 100]
You could do:
TO MODVAR :VARIABLE :AMOUNT
IF THING :VARIABLE > :AMOUNT [MAKE :VARIABLE THING :VARIABLE - :AMOUNT]
END
MODVAR "SIZE 100
But even things like WHILE can be implemented:
TO WHILE :COND :BLOCK
IF :COND [EVAL :BLOCK WHILE :COND :BLOCK]
END
And the blocks are just lists, so you could potentially rewrite them.
I was looking at Berkeley Logo to remind myself of the commands, and found that CASE (similar to switch) is implemented as a macro: https://github.com/jrincayc/ucblogo-code/blob/26ae6f01105832ced8fcdf05eaf43321765ff374/logolib/case https://github.com/jrincayc/ucblogo-code/blob/26ae6f01105832... – though it seems like it could be implemented just fine as a regular function. Though :caseignoredp is confusing me a bit... it's technically a dynamically-scoped variable that affects many comparison operations, but that wouldn't work with a macro. I wonder if that's a bug from when it was converted from a normal function to a macro.
- ianbicking 4y agoOops, while should be: TO WHILE :COND :BLOCK IF RUNRESULT :COND [RUN :BLOCK WHILE :COND :BLOCK] END But this does fail when you do some things in the block, like [OUTPUT] (equivalent of return). Also looking closer at UCBLogo macros and they are evaluated at runtime in a way I didn't expect. That is, they are expanded at call time, and can self-reference causing repeated expansions (but the expansions are immediately evaluated so the program size isn't effected). But I think they really could have accomplished the same thing more easily with the Tcl uplevel command.