---
title: 纏まりのあるデータは1つの引数や入力欄として統合的に扱う
date: 2024-07-01T02:00:10.000Z
updated: 2026-01-08T14:50:59.344Z
url: https://baku89.com/%E7%BA%8F%E3%81%BE%E3%82%8A%E3%81%AE%E3%81%82%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF1%E3%81%A4%E3%81%AE%E5%BC%95%E6%95%B0%E3%82%84%E5%85%A5%E5%8A%9B%E6%AC%84%E3%81%A8%E3%81%97%E3%81%A6%E7%B5%B1%E5%90%88%E7%9A%84%E3%81%AB%E6%89%B1%E3%81%86
---

# 纏まりのあるデータは1つの引数や入力欄として統合的に扱う

[Processing](/Processing)のAPI、`circle(x, y, d)` か `circle([x, y], d)` でいうと後者の方が好み\
なぜなら `circle(vec2.add(a, b), d)` が出来るから

p5.jsの方なら `circle(...vec2.add(a, b), d`）でも良いのだけど、いかんせん`p5.Vector`は`{x: number, y: number, z?: number}`なので、spread syntaxが使えない

これって別にp5に限った話でなく「意味としてまとまりのあるデータ型は1つの引数や入力欄として統合的に扱えたほうが良い」と思っている　レイヤートランスフォームは mat2d で纏め、そのデフォ式を次のようにするなど。

```
(mat2d/*
  (mat2d/translate [0 0])
  (mat2d/rotate 0)
  (mat2d/scale [1 1]))
```

この記法があれば、トランスフォーム値を乗算するためだけにヌルレイヤーを用意する必要がなくなるし、別個に分かれたtx, ty, tzそれぞれに似たようなエクスプレッションを設定する必要も無くなる

![](https://wp.baku89.com/wp-content/uploads/2026/07/scrapbox-66820e0f75681d001d60fbd3.png)

ここで大事なのは、「デフォルト値」ではなく「デフォルト式」であること。値のデフォは`[1 0 0 1 0 0]`の単位行列だけど、それが6つの独立したスライダーとして表示されても使い勝手が悪い。となると、式が返す値ではなく、式というシニフィアンそのものを文法の中で（quote式により）指し示すことの出来るLispが、こうした機能の記述には適している。

```
mat2d:
(=> [...^{...(Vector Mat2d)
             default: `[(mat2d/translate [0 0])
                        (mat2d/rotate 0)
                        (mat2d/scale [1 1])]}
        ms] (body-of-function))
```
