- [Screwlisp proposes a kitten](https://screwlisp.small-web.org)
# Game grid KRF actions from lisp code.
Alright, let us do something with these types. Software-individuals have a lot of opinions, so do not take this devlog as implying always and only. I will also mostly belay lengthy philosophical apologies. But let us first make a `<sequence <of sequences> <of < nil bird insect plant> s>` slowly and deliberately. Then, software-individuals do not want themselves to be a graphical application, so I am imagining them producing basically an input to [McCLIM](https://codeberg.org/McCLIM/McCLIM) like I just [told our friend ACDW they could try](https://itch.io/jam/spring-lisp-game-jam-2025/topic/4856768/lightweight-2d-cl-game-engine).

## Slowly building a rectangular grid
I am still eepitching like I [started here](https://screwlisp.small-web.org/lispgames/plant-insect-bird-game-sketch/). Lets see what we can do by hand in the manually-interacting part of my [Pawn-75 software-individuals](https://codeberg.org/tfw/pawn-75).

### Setting session variables (of sequences)
```
ssv .line1 <nil nil nil nil nil>
```
Sandewall said that everyone starts by asking to be able to do this and it is just not that useful, but he included it for them anyway. Those are regular `nil`s. Let's start with a 10x10 grid and see what is happening.

### Concatenating sequences
I guess his will work.
```
ssv .line10 (concat .line1 .line1)
ssv .lines2 <.line10 .line10 .line10 .line10 .line10>
ssv .lines10 (concat .lines2 .lines2)
```

```
ses.064) .lines10
 =>
<<nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>
   <nil    nil    nil    nil    nil    nil    nil    nil    nil    nil>>
```
Well, I can't say this was the most beautiful way to do things, but we certainly have a sequence of ten sequences of ten nils, made using software-individuals' primitives.

### Aside: str.concat and union
The analogous str.concat exists:
```
ses.074) ssv .z (str.concat "a" "b")

ses.075) .z
 => "ab"

ses.076) (str.concat .z .z)
 => "abab"

ses.077) (str.concat (str.concat .z .z) (string z))
 => "ababz"

ses.078) (str.concat (str.concat .z .z) (string .z))
 => "ababab"
```
and union for sets.
```
ses.065) (union {a b c} {c d e})
 => {a b c d e}
```
Some accessor idioms.
```
ses.083) (t1 <1 2 3>)
 => <2 3>

ses.084) (e1 <1 2 3>)
 => 1

ses.085) (e2 <1 2 3>)
 => 2
```
But this is not well suited right now. Let us just
# leodef some lisp
```
put make-grid type lispdef
addmember (get board contents) make-grid
writefil board
```
Since the def is multiple lines, you invoke whatever editor. At the end we can now find this:
```../../../demus/Game/board.leo
---------------------------------------------------------
-- make-grid

[: type lispdef]
[: latest-rearchived nil]

```
We can just add our leodef there. I can't say I am stupendously happy with how I have figured out to do low level work, but I /do/ think the intent is that the nice logical notation was for interactive work, and that you do end up doing Norvigian low level pure lisp new functionalities.

```
---------------------------------------------------------
-- make-grid

[: type lispdef]
[: latest-rearchived nil]

(leodef tile-grid tile-grid (x y z)
       (setf
        (get x 'tiles)
        (let ((empty-row `(seq& ,(loop :repeat z :collect nil :into nils
                                       :finally (return nils)))))
          `(seq& ,(loop :repeat y :collect (copy-tree empty-row))))))
```
## Try the new def.
```
loadk board
tile-grid grid1 2 3
```
-.
```
ses.118) tile-grid grid1 2 3
<<nil
   nil>
   <nil
   nil>
   <nil
   nil>>
```
Well, we can make an empty grid. We should definitely be checking grid1 was or could be something that had tiles though. For now if I can just interoperate between my logic and lisp freely, I am content to begin with.

Actually, this seems like a moment to stop as well. We got to adding infterface commands and internal defuns with lisp to our KRF game.

# Dramatic conclusion tomorrow!
See everyone
- [on the mastodon](https://mastodon.sdf.org)
- At [Kent Pitman](https://nhplace.com)'s interview on the [show on Wednesday 000UTC](https://communitymedia.video/c/screwtape_channel/videos) (watch the mastodon)
- [In the lispgames jam](https://itch.io/jam/spring-lisp-game-jam-2025/topic/4858711/what-genre-is-simulation-eat-things-or-you-die)