Monorepo for Aesthetic.Computer
aesthetic.computer
1% !TEX program = xelatex
2\documentclass[10pt,letterpaper,twocolumn]{article}
3
4\usepackage[top=0.75in, bottom=0.75in, left=0.75in, right=0.75in]{geometry}
5\usepackage{fontspec}\usepackage{unicode-math}
6\setmainfont{Latin Modern Roman}\setsansfont{Latin Modern Sans}
7\newfontfamily\acbold{ywft-processing-bold}[Path=../../system/public/type/webfonts/,Extension=.ttf]
8\newfontfamily\aclight{ywft-processing-light}[Path=../../system/public/type/webfonts/,Extension=.ttf]
9\newfontfamily\kidlispfont{ComicRelief-Regular}[Path=../arxiv-kidlisp/fonts/,Extension=.ttf]
10\newfontfamily\kidlispbold{ComicRelief-Bold}[Path=../arxiv-kidlisp/fonts/,Extension=.ttf]
11\setmonofont{Latin Modern Mono}[Scale=0.85]
12
13\usepackage{xcolor}\usepackage{titlesec}\usepackage{enumitem}\usepackage{booktabs}\usepackage{tabularx}\usepackage{multicol}\usepackage{fancyhdr}\usepackage{hyperref}\usepackage{graphicx}
14\graphicspath{{figures/}{../../papers/arxiv-ac/figures/}}
15\usepackage{ragged2e}\usepackage{microtype}\usepackage{listings}\usepackage{natbib}\usepackage[colorspec=0.92]{draftwatermark}
16
17\definecolor{acpink}{RGB}{180,72,135}\definecolor{acpurple}{RGB}{120,80,180}\definecolor{acdark}{RGB}{64,56,74}\definecolor{acgray}{RGB}{119,119,119}
18\definecolor{klbrand}{RGB}{205,92,155}\definecolor{klcyan}{RGB}{112,214,255}\definecolor{kldark}{RGB}{48,43,58}\definecolor{draftcolor}{RGB}{205,92,155}
19
20\definecolor{klparen}{RGB}{140,140,160}\definecolor{klkw}{RGB}{119,51,170}\definecolor{klfn}{RGB}{0,136,170}\definecolor{klcolor}{RGB}{204,80,0}\definecolor{klnum}{RGB}{204,0,102}\definecolor{klstr}{RGB}{44,145,44}\definecolor{klcmt}{RGB}{140,140,140}\definecolor{klvar}{RGB}{50,50,50}\definecolor{klspecial}{RGB}{180,72,135}\definecolor{klbg}{RGB}{250,248,252}
21
22\DraftwatermarkOptions{text=WORKING DRAFT,fontsize=3cm,color=draftcolor!18,angle=45}
23
24\hypersetup{colorlinks=true,linkcolor=acpurple,urlcolor=acpurple,citecolor=acpurple,pdftitle={KidLisp sprogreference: 118 indbyggede funktioner i 12 kategorier}}
25
26\titleformat{\section}{\normalfont\bfseries\normalsize\uppercase}{\thesection.}{0.5em}{}
27\titlespacing{\section}{0pt}{1.2em}{0.3em}
28\titleformat{\subsection}{\normalfont\bfseries\small}{\thesubsection}{0.5em}{}
29\titlespacing{\subsection}{0pt}{0.8em}{0.2em}
30
31\pagestyle{fancy}\fancyhf{}\renewcommand{\headrulewidth}{0pt}
32\fancyhead[C]{\footnotesize\color{acpink}\textit{Arbejdsudkast --- ikke til citation}}
33\fancyfoot[C]{\footnotesize\thepage}
34
35\newcommand{\ac}{\textsc{Aesthetic.Computer}}
36\newcommand{\kl}{\textsc{KidLisp}}
37
38\lstdefinelanguage{kidlisp}{
39 morekeywords=[1]{def,if,repeat,once,later,die,let,do,fn},
40 morekeywords=[2]{wipe,ink,line,box,circle,tri,plot,flood,shape,write,type,paste,print},
41 morekeywords=[3]{scroll,zoom,spin,blur,contrast,suck,pan,sort,resetSpin,smoothspin,unpan,fill,outline,stroke,nofill,nostroke},
42 morekeywords=[4]{random,wiggle,sin,cos,tan,floor,ceil,round,abs,sqrt,min,max,mod},
43 morekeywords=[5]{width,height,frame,time,resolution,fps,screen,pen,hand,gamepad,mic,amplitude},
44 morekeywords=[6]{cube,form,trans,move,scale,hop,delay,jump,melody,overtone,speaker,sound},
45 morekeywords=[7]{embed,layer,fade,bake,list,get,set,tap},
46 sensitive=true,morecomment=[l]{;},morestring=[b]",
47 literate={(}{{{\color{klparen}(}}}1 {)}{{{\color{klparen})}}}1 {\$}{{{\color{klspecial}\$}}}1,
48}
49
50\lstdefinestyle{kidlispstyle}{
51 language=kidlisp,basicstyle=\ttfamily\small,
52 keywordstyle=[1]\color{klkw}\bfseries,keywordstyle=[2]\color{klfn}\bfseries,
53 keywordstyle=[3]\color{acpurple},keywordstyle=[4]\color{klnum},
54 keywordstyle=[5]\color{klspecial},keywordstyle=[6]\color{klfn},keywordstyle=[7]\color{acpink},
55 commentstyle=\color{klcmt}\itshape,stringstyle=\color{klstr},numberstyle=\tiny\color{klcmt},
56 breaklines=true,frame=single,rulecolor=\color{acgray!30},backgroundcolor=\color{klbg},
57 xleftmargin=0.5em,xrightmargin=0.5em,aboveskip=0.5em,belowskip=0.5em,showstringspaces=false,
58}
59
60\lstset{style=kidlispstyle}
61
62\setlist[itemize]{nosep, leftmargin=1.2em, itemsep=0.1em}
63\setlength{\columnsep}{1.8em}\setlength{\parindent}{1em}\setlength{\parskip}{0.3em}
64
65% Hyphenation for narrow two-column layout
66\tolerance=800
67\emergencystretch=1em
68\hyphenpenalty=50
69
70\begin{document}
71
72\twocolumn[{%
73\begin{center}
74\includegraphics[height=4em]{pals}\par\vspace{0.5em}
75{\kidlispbold\fontsize{26pt}{30pt}\selectfont\color{kldark} Kid{\color{klbrand}Lisp} sprogreference}\par
76\vspace{0.2em}
77{\kidlispfont\fontsize{11pt}{13pt}\selectfont\color{klbrand} 118 indbyggede funktioner i 12 kategorier til generativ kunst}\par
78\vspace{0.3em}
79{\kidlispfont\fontsize{9pt}{11pt}\selectfont\color{acgray} Syntaks, semantik, timing, farve og \texttt{\$}-kode kompositionssystemet}\par
80\vspace{0.6em}
81{\normalsize\href{https://prompt.ac/@jeffrey}{@jeffrey}}\par
82{\small\color{acgray} Aesthetic.Computer}\par
83{\small\color{acgray} ORCID: \href{https://orcid.org/0009-0007-4460-4913}{0009-0007-4460-4913}}\par
84\vspace{0.3em}
85{\small\color{acpurple} \url{https://aesthetic.computer}}\par
86\vspace{0.6em}
87\rule{\textwidth}{1.5pt}
88\vspace{0.5em}
89\end{center}
90
91\begin{center}
92{\small\color{acpink}\textbf{[ arbejdsudkast --- ikke til citation ]}}
93\end{center}
94\vspace{0.3em}
95
96\begin{quote}
97\small\noindent\textbf{Abstrakt.}
98\kl{} er en minimal Lisp-dialekt til generativ kunst med 118 indbyggede funktioner fordelt på 12 kategorier, ingen brugerdefinerede funktioner, ingen rekursion, ingen fil-I/O og intet netværk. Det er sikkert ved konstruktion: et \kl{}-program kan ikke bryde ud af sin sandbox, crashe sin vært eller tilgå ressourcer ud over sit lærred. Denne artikel fungerer som en komplet sprogreference, der dokumenterer enhver indbygget funktion med syntaksfremhævede eksempler, timingsystemet (frame-baseret og sekundbaseret planlægning uden callbacks), farvemodellen (navngivne farver, RGB, gradienter, mønstre), \texttt{\$}-kode kompositionssystemet (indlejring af programmer ved reference som den primære abstraktionsmekanisme) og evalueringsmodellen (fuld AST-reevaluering hvert frame med deterministisk PRNG). Vi præsenterer \kl{} som et sprog designet omkring \emph{udeladelse}: hvad det ikke kan, er lige så bevidst som hvad det kan, og begrænsningerne producerer et kreativt rum, som 59 forfattere har brugt til at skrive 16.634 programmer.
99\end{quote}
100\vspace{0.5em}
101}]
102
103\section{Syntaks}
104
105\kl{} bruger S-udtrykssyntaks~\citep{mccarthy1960recursive}. Ethvert udtryk er enten et atom (tal, streng, symbol) eller en liste omsluttet af parenteser:
106
107\begin{lstlisting}
108; Atomer
10942 ; tal
110"hello" ; streng
111red ; symbol (farvenavn)
112
113; Lister (funktionsapplikation)
114(wipe "navy") ; ryd skærm marineblå
115(ink "red") ; sæt tegnefarve
116(box 10 10 50 50) ; tegn rektangel
117(circle 64 64 30) ; tegn cirkel
118\end{lstlisting}
119
120Der er ingen operatorer, ingen infiks-notation, ingen speciel syntaks ud over parenteser, strenge, tal og symboler. Aritmetik bruger præfiks-notation:
121
122\begin{lstlisting}
123(+ 1 2) ; => 3
124(* 3 (+ 1 2)) ; => 9
125(- 10 3) ; => 7
126(/ 100 4) ; => 25
127(% 17 5) ; => 2 (modulo)
128\end{lstlisting}
129
130\section{De 12 kategorier}
131
132\subsection{Grafik (9 funktioner)}
133
134Tegneprimitiver opererer i immediate-mode---hvert kald renderer direkte til framebufferen.
135
136\begin{lstlisting}
137(wipe "black") ; ryd lærred
138(ink "cyan") ; sæt farve
139(line 0 0 128 128) ; diagonal linje
140(box 10 10 40 40) ; rektangel
141(circle 64 64 20) ; cirkel i centrum
142(tri 32 10 10 54 54 54) ; trekant
143(plot 64 64) ; enkelt pixel
144(flood 64 64) ; oversvømmelsesfyld
145(shape 10 10 50 10 30 50) ; polygon
146\end{lstlisting}
147
148\texttt{fill} og \texttt{outline} kontrollerer, om former er udfyldte eller stregede:
149
150\begin{lstlisting}
151(fill) ; udfyldte former
152(ink "red")
153(circle 64 64 30) ; massiv rød cirkel
154
155(outline) ; stregede former
156(ink "white")
157(circle 64 64 30) ; hvid ring
158\end{lstlisting}
159
160\subsection{Transformationer (11 funktioner)}
161
162Pixelniveau-transformationer opererer på framebufferen efter tegning:
163
164\begin{lstlisting}
165(scroll 1 0) ; flyt pixels til højre
166(zoom 1.01) ; langsom zoom ind
167(spin 1) ; rotér 1 grad
168(blur 2) ; gaussisk sløring
169(contrast 1.2) ; øg kontrast
170(suck 0.5) ; radial forskydning
171(sort) ; sortér pixels efter lysstyrke
172\end{lstlisting}
173
174Transformationer \emph{akkumulerer} på tværs af frames, hvilket producerer animation uden eksplicit tilstandsstyring.
175
176\subsection{Matematik (14 funktioner)}
177
178\begin{lstlisting}
179(sin (* frame 0.05)) ; sinusbølge
180(cos (* frame 0.03)) ; cosinusbølge
181(random) ; 0-255
182(random 10) ; 0-9
183(random 5 15) ; 5-14
184(wiggle 10) ; tilfældig +/-5
185(floor 3.7) ; => 3
186(abs -5) ; => 5
187(sqrt 16) ; => 4
188(min 3 7 1) ; => 1
189(max 3 7 1) ; => 7
190\end{lstlisting}
191
192\texttt{random} bruger en seedet PRNG initialiseret fra programmets korte kode, hvilket gør alt generativt output \textbf{deterministisk}: det samme program producerer altid det samme visuelle.
193
194\subsection{Farve (19+ navngivne farver)}
195
196\begin{lstlisting}
197(ink "red") ; navngivet farve
198(ink 255 0 0) ; RGB
199(ink 255 0 0 128) ; RGBA (semi-transparent)
200(ink "fade:red-blue") ; horisontal gradient
201(ink (fade "cyan" "magenta" "vertical"))
202(ink "rainbow") ; gentagende regnbue
203(ink "zebra") ; stribet mønster
204\end{lstlisting}
205
206\subsection{System og display (9 funktioner)}
207
208\begin{lstlisting}
209(def w width) ; skærmbredde
210(def h height) ; skærmhøjde
211frame ; nuværende framenummer
212time ; sekunder forløbet
213
214(resolution "half") ; halv opløsning
215(resolution 64 64) ; eksplicit 64x64
216(fps 30) ; sæt framerate
217\end{lstlisting}
218
219\subsection{Kontrolflow (7 funktioner)}
220
221\begin{lstlisting}
222; Variabeldefinition
223(def x 50)
224(def y (+ 10 (* frame 0.5)))
225
226; Betinget
227(if (> frame 60)
228 (ink "red")
229 (ink "blue"))
230
231; Løkke
232(repeat 10 i
233 (circle (* i 12) 64 5))
234
235; Eksekvér én gang (ikke hvert frame)
236(once (wipe "black"))
237
238; Lokal binding
239(let ((cx 64) (cy 64))
240 (circle cx cy 30))
241\end{lstlisting}
242
243\subsection{Timing}
244
245\kl{}'s timingsystem bruger \emph{inline-planlægning} snarere end callbacks:
246
247\begin{lstlisting}
248; Frame-baseret timing
249(0 (wipe "black")) ; hvert frame
250(1 (spin 5)) ; hvert 2. frame
251(30f (ink "red")) ; efter 30 frames
252
253; Sekundbaseret timing
254(1s (wipe "red")) ; efter 1 sekund
255(2.5s (ink "gold")) ; efter 2,5 sekunder
256(1s! (write "!" 10 10)) ; affyr én gang ved 1s
257
258; Gentagende intervaller
259(0.5s... (spin 45)) ; hvert 0,5 sekund
260(1s... (scroll 1 0)) ; hvert sekund
261\end{lstlisting}
262
263Dette eliminerer behovet for \texttt{setTimeout}, \texttt{setInterval} eller animationsframe-callbacks. Tid er en \emph{egenskab ved udtrykket}, ikke en funktion kaldt på det.
264
265\subsection{Tekst (4 funktioner)}
266
267\begin{lstlisting}
268(write "hello" 10 20) ; tekst ved position
269(write "centreret" ; centreret tekst
270 (/ width 2) (/ height 2))
271(type "typed" 10 10) ; skrivemaskineeffekt
272\end{lstlisting}
273
274\subsection{Input (3 funktioner)}
275
276\begin{lstlisting}
277; Pen/museposition og -tilstand
278(if pen
279 (circle pen.x pen.y 5))
280
281; Berøringsinput
282(if hand
283 (line hand.x hand.y 64 64))
284\end{lstlisting}
285
286\subsection{Lyd (6 funktioner)}
287
288\begin{lstlisting}
289; Mikrofoninput
290(def vol (mic)) ; amplitude 0-255
291(circle 64 64 vol) ; lydreaktiv
292
293; Melodiafspilning
294(melody "C4 E4 G4 C5")
295
296; Overtonharmonikker
297(overtone 440 3) ; 3. harmonik af A4
298\end{lstlisting}
299
300\subsection{3D-grafik (8 funktioner)}
301
302\begin{lstlisting}
303(cube "mycube") ; opret 3D-kube
304(form "mycube"
305 (move 0 0 -5) ; position
306 (scale 2) ; størrelse
307 (spin (* frame 0.5) 1 1 0)) ; rotér
308\end{lstlisting}
309
310\subsection{Komposition via \texttt{\$}-koder}
311
312Den mest karakteristiske funktion i \kl{} er dens kompositionssystem. I stedet for brugerdefinerede funktioner refererer programmer til andre programmer via deres korte kode:
313
314\begin{lstlisting}
315; Indlejr et andet program som et lag
316($cow) ; eksekvér program "cow"
317($nece 10 20) ; send parametre
318
319; Flerlagskomposition
320(wipe "black")
321($cow) ; baggrundsslag
322($faim) ; forgrundslag
323\end{lstlisting}
324
325Programmer hentes fra MongoDB, caches i RAM og IndexedDB og indholdsadresseres via SHA-256. \texttt{\$}-kodesystemet erstatter brugerdefinerede funktioner, moduler og biblioteker med en enkelt social mekanisme: \emph{find et program nogen har lavet, referér det via kode, komponér med det}.
326
327\section{Evalueringsmodel}
328
329\kl{} reevaluerer sit \textbf{hele AST hvert frame}. Der er ingen bevaret tilstand ud over eksplicit definerede variabler. \texttt{frame}- og \texttt{time}-variablerne inkrementeres automatisk. Transformationer som \texttt{zoom}, \texttt{scroll} og \texttt{spin} akkumulerer i framebufferen.
330
331Denne model eliminerer \texttt{setup()}/\texttt{draw()}-opdelingen kendt fra Processing~\citep{reas2007processing}. Enhver linje i et \kl{}-program eksekverer hvert frame.
332
333\subsection{Deterministisk tilfældighed}
334
335\texttt{random} er seedet fra programmets korte kode. Det samme program producerer identisk output på enhver enhed, hver gang. Dette gør \kl{}-programmer til \emph{reproducerbar generativ kunst}.
336
337\subsection{Kaostilstand}
338
339Ugyldig input producerer ikke fejlmeddelelser. I stedet detekterer \kl{} lave genkendelsesforhold og renderer kunstnerisk visuelt output. Brugeren ser aldrig ``SyntaxError.'' De ser farver.
340
341\section{Design via udeladelse}
342
343\kl{} mangler bevidst:
344
345\begin{itemize}
346 \item \textbf{Brugerdefinerede funktioner}: erstattet af \texttt{\$}-kode komposition
347 \item \textbf{Rekursion}: forhindrer uendelige løkker og stakoverløb
348 \item \textbf{Fil-I/O}: lærredet er det eneste output
349 \item \textbf{Netværk}: programmer kan ikke hente eksterne data
350 \item \textbf{Strengmanipulation}: ingen \texttt{concat}, \texttt{split}, \texttt{replace}
351 \item \textbf{Fejlmeddelelser}: erstattet af kaostilstand
352 \item \textbf{Import/require}: erstattet af \texttt{\$}-koder
353 \item \textbf{Objekter/klasser}: data er tal, strenge og lister
354\end{itemize}
355
356Hver udeladelse er en designbeslutning. Fraværet af brugerdefinerede funktioner tvinger komposition gennem det sociale lag. Fraværet af fejlmeddelelser betyder, at begyndere aldrig møder en mur af rød tekst. Fraværet af netværk betyder, at ethvert program er selvstændigt og sikkert at køre.
357
358Dette følger princippet om, at et sprogs begrænsninger definerer dets kreative rum mere end dets funktioner~\citep{papert1980mindstorms, compton2015casual}. \kl{} er ikke et generelt sprog, der tilfældigvis laver kunst. Det er et kunstsprog, der \emph{ikke kan} gøre andet.
359
360\section{Komplet indbygget indeks}
361
362\begin{table}[h]
363\small\centering
364\begin{tabularx}{\columnwidth}{Xlr}
365\toprule
366\textbf{Kategori} & \textbf{Antal} & \textbf{Kernefunktioner} \\
367\midrule
368Grafik & 9 & wipe, ink, line, box, circle \\
369Transformationer & 11 & scroll, zoom, spin, blur, suck \\
370Matematik & 14 & +, -, *, /, random, sin, cos \\
371Farve & 19+ & red, blue, fade, rainbow, zebra \\
372System/Display & 9 & width, height, frame, time \\
373Kontrolflow & 7 & def, if, repeat, once, let \\
374Tekst/Output & 4 & write, type, paste, print \\
375Input & 3 & pen, hand, gamepad \\
376Lyd & 6 & mic, melody, overtone, sound \\
3773D-grafik & 8 & cube, form, trans, move, scale \\
378Komposition & 4 & \$code, layer, bake, embed \\
379Data & 4 & list, get, set, let \\
380\midrule
381\textbf{Total} & \textbf{118} & \\
382\bottomrule
383\end{tabularx}
384\caption{Alle 118 indbyggede funktioner efter kategori.}
385\label{tab:builtins}
386\end{table}
387
388\section{Eksempel: Komplet program}
389
390Et komplet \kl{}-program, der tegner et lydreaktivt partikelfelt med orbital bevægelse:
391
392\begin{lstlisting}
393"black"
394(def vol (+ 5 (* (mic) 0.2)))
395(repeat 50 i
396 (def angle (* i 0.1256))
397 (def r (+ 20 (* vol (sin (+ (* frame 0.02) angle)))))
398 (def cx (+ 64 (* r (cos (+ angle (* frame 0.01))))))
399 (def cy (+ 64 (* r (sin (+ angle (* frame 0.01))))))
400 (ink (+ 100 (* i 3)) 50 (+ 150 (* i 2)))
401 (circle cx cy (+ 1 (random 3))))
402(blur 1)
403(zoom 1.002)
404\end{lstlisting}
405
406Dette program: sætter en sort baggrund, læser mikrofonamplitude, tegner 50 partikler i orbitale baner moduleret af lyd, farver dem med en beregnet gradient, anvender en let sløring og zoomer langsomt ind. Det kører ved 60 FPS. Det er 12 linjer langt. Det kræver ingen imports, ingen setup-funktion, ingen animationsløkke og ingen hændelseslyttere.
407
408\vspace{0.5em}
409\noindent\textbf{ORCID:} \href{https://orcid.org/0009-0007-4460-4913}{0009-0007-4460-4913}
410
411\vspace{0.5em}\noindent\textit{Oversat fra engelsk. Originalversion tilgængelig på \url{https://papers.aesthetic.computer}}
412
413\bibliographystyle{plainnat}
414\bibliography{references}
415
416\end{document}