Bagian aktif Syntax
7. Type System
Status dokumen: Normative
RelGeo menggunakan sistem tipe eksplisit.
Seluruh parameter, constant, derived value, query result, dan property turunan memiliki tipe yang terdefinisi.
7.1 Scalar Types
length
Nilai panjang.
Contoh:
10mm
25cm
4in
Semua nilai length dievaluasi relatif terhadap scene.unit dan disimpan dalam bentuk yang sudah ternormalisasi oleh resolver.
number
Nilai numerik tanpa satuan.
Contoh:
5
12.5
angle
Nilai sudut.
Contoh:
45deg
90deg
percent
Nilai persentase.
Contoh:
50%
Nilai percent mempertahankan makna proporsional. Implementasi boleh menormalkannya ke representasi numerik internal selama kontrak semantiknya tetap sama.
boolean
Nilai logika.
Contoh:
true
false
string
Nilai teks.
Contoh:
"Rear Panel"
7.2 Structured Types
point
Koordinat dua dimensi.
[10mm, 20mm]
vector
Representasi arah atau perpindahan dalam 2D.
Contoh:
[1, 0] # vektor ke kanan
[0, -1] # vektor ke atas (y-down)
array
Kumpulan nilai berurutan.
- 10
- 20
- 30
object
Kumpulan field bernama.
diameter: 6mm
count: 4
frame2d
Representasi posisi dan orientasi pada suatu titik di lintasan.
Field yang dikandung:
point (wajib) — koordinat 2D posisi
angle (wajib) — sudut orientasi dalam radian
tangent (turunan) — vektor tangent di posisi tersebut
normal (turunan) — vektor normal di posisi tersebut
tangent dan normal dapat diturunkan dari angle. Keduanya bersifat read-only.
Contoh akses field frame2d:
derived:
posisi: frameAt(outline, 0.25).point
sudut: frameAt(outline, 0.25).angle
normal: frameAt(outline, 0.25).normal
bbox2d
Representasi world-space bounding box yang dihasilkan oleh query bbox(...).
Field yang dikandung:
minX (wajib) — batas kiri bbox
maxX (wajib) — batas kanan bbox
minY (wajib) — batas atas bbox
maxY (wajib) — batas bawah bbox
width (wajib) — lebar bbox
height (wajib) — tinggi bbox
Contoh akses field bbox2d:
derived:
panelBox: bbox(panel)
panelLeft: bbox(panel).minX
panelWidth: bbox(panel).width
Catatan:
bbox2dadalah hasil query, bukan object geometri biasabbox2dtidak otomatis menjadiPlaceableObjectbbox2dtidak otomatis memiliki seluruh anchors object biasa
collection
Kumpulan objek runtime yang dihasilkan oleh sistem.
Contoh sumber collection:
repeat
divide
split (tanpa `pick`)
multi-result intersection
multi-result boolean
path-ref
Referensi ke geometri berbasis lintasan. Digunakan sebagai parameter untuk on.path, on.frame, query seperti pointAt, tangentAt, frameAt, dll.
Surface ini juga menjadi dasar konseptual untuk item pada path.join.
Tipe ini tidak diinstansiasi secara eksplisit - melainkan diperoleh dengan merujuk nama object bertipe line, arc, ellipse, path, polygon, bentuk tertutup apapun, atau geometry operation result yang tetap/path-like:
objects:
outline:
type: path
...
marker:
type: rect
on:
path:
ref: outline # outline adalah path-ref
t: 0.5
Jika sebuah geometry operation object menghasilkan surface lintasan yang kompatibel, result tersebut juga sah diperlakukan sebagai path-ref.
Khusus untuk split:
- jika
pick: first | lastdipakai, hasil tunggalnya sah diperlakukan sebagaipath-ref - jika
picktidak dipakai, hasilnya adalahcollectionyang item-itemnya masing-masing tetap path-like
Catatan:
ellipseberada pada level yang sama dengan primitive lintasan lain dalam surface iniellipsetidak hanya closed shape untukarea, tetapi juga lintasan deterministik untukpointAt,tangentAt,normalAt,frameAt, dantAtLength
Contoh:
objects:
leftArc:
type: arc
...
rightArc:
type: reverse
target: leftArc
marker:
type: rect
on:
path:
ref: rightArc
t: 0.5
ClosedShape
Surface semantik untuk object tertutup 2D yang sah dipakai pada query seperti area(...) dan perimeter(...).
Target minimum yang termasuk ClosedShape:
rect
circle
ellipse
polygon
boolean result
path tertutup
geometry operation result yang tetap tertutup
Catatan:
ClosedShapeadalah surface eligibility, bukan syntax type yang ditulis author secara eksplisit- target yang termasuk
ClosedShapeboleh tetap path-like pada saat yang sama - target
ClosedShapeyang path-like tetap sah dipakai padalength(...)
7.3 Type Safety
Resolver wajib:
- mempertahankan tipe hasil evaluasi
- memvalidasi operasi antar tipe
- menghasilkan error jika tipe tidak kompatibel
Tidak diperbolehkan melakukan konversi implisit yang dapat mengubah makna geometris.
7.4 Contextual Numeric Semantics
RelGeo membedakan angka murni sebagai number dari angka yang dipakai sebagai panjang kontekstual.
Aturan umum:
- pada konteks yang mengharapkan
length, angka tanpa unit diperlakukan sebagai panjang dalamscene.unit - pada konteks aritmetika skalar, angka tanpa unit tetap bertipe
number - satuan eksplisit selalu lebih kuat daripada default context
Contoh:
width: 72 → 72 dalam scene.unit
10 * 20cm → 200cm
100cm / 2 → 50cm
7.5 Unit and Coercion Contract
Untuk spec aktif v0.5, coercion yang dianggap sah harus tetap sempit dan deterministik.
Aturan minimum:
length + lengthdanlength - lengthsahnumber * lengthdanlength / numbersahnumber + number,number - number,number * number,number / numbersahlength * lengthtidak sah- operasi campuran yang mengaburkan makna geometri harus ditolak
Contoh:
10cm + 5mm -> sah
2 * 10cm -> sah
10cm / 2 -> sah
10cm * 5cm -> invalid
10cm + true -> invalid
Aturan unitless number:
- angka tanpa unit hanya boleh diperlakukan sebagai
lengthbila konteksnya memang mengharapkan panjang - di luar konteks panjang, angka tanpa unit tetap
number - implementasi tidak boleh mengonversi
numberkelengthhanya karena “terasa masuk akal” tanpa konteks yang eksplisit
Aturan string coercion minimum:
- coercion implisit ke
stringhanya sah pada family fungsi string aktif seperticoncat(...)danformat(...) - di luar surface itu, implementasi tidak boleh diam-diam mengubah nilai typed menjadi
string
Catatan:
- kontrak ini sengaja sempit agar bahasa tetap relation-first dan dapat diprediksi
- perluasan coercion di luar daftar ini sebaiknya diperlakukan sebagai proposal versi berikutnya, bukan asumsi aktif v0.5