From 130f36989d8d57d0d46b530d11eefcba84ee7a99 Mon Sep 17 00:00:00 2001 From: sorrel Date: Tue, 23 Jan 2024 17:17:57 -0500 Subject: [PATCH 01/16] stub a few things; finish fca writeup --- .../documentation-driven-development.scm | 0 in-progress/feature-change-applier.scm | 100 ++++++++++++++++++ in-progress/latl-primitives.scm | 0 in-progress/syntax-considered-harmful.scm | 0 static/img/settled/1/fca.jpg | Bin 0 -> 45291 bytes static/style/styles.css | 9 ++ 6 files changed, 109 insertions(+) create mode 100644 in-progress/documentation-driven-development.scm create mode 100644 in-progress/feature-change-applier.scm create mode 100644 in-progress/latl-primitives.scm create mode 100644 in-progress/syntax-considered-harmful.scm create mode 100644 static/img/settled/1/fca.jpg diff --git a/in-progress/documentation-driven-development.scm b/in-progress/documentation-driven-development.scm new file mode 100644 index 0000000..e69de29 diff --git a/in-progress/feature-change-applier.scm b/in-progress/feature-change-applier.scm new file mode 100644 index 0000000..e9397ec --- /dev/null +++ b/in-progress/feature-change-applier.scm @@ -0,0 +1,100 @@ +(article + (hgroup + (h1 "feature change applier") + (p (em "a first attempt at a conlanging tool"))) + (section + (hgroup + (h2 "what is this?") + (p + (em + "a tool for conlanging: a feature-based sound-change applier + capable of applying multiple sets of rules at once.")) + (hr)) + (p + "you can try it out here: " + (a ((href "https://sorrelbri.github.io/feature-change-applier/")) + "feature change applier app")) + (img ((src "/static/img/settled/1/fca.jpg") + (alt "an image of Feature Change Applier application. visible + are labeled sections. 'proto language lexicon' is a text + field with nonsense weirds. 'phonetic features' is a list + of binary values shuch as '+ back' / '- back' and + characters representing associated sounds like 'a / u / ɯ' + / 'ə', 'epoch 1' is a text field with a list of phonetic + rules such as + '[+ occlusive - nasal]>[+ occlusive + nasal]/n_.' and + buttons to 'Remove epoch 1' or 'Add Epoch'. 'modeling + options' is a single selected radio button labeled + 'Default output' with buttons labeled 'Run Changes' and + 'Clear Output'. 'Results of Run' is a list headed 'epoch + 1' and containing newline separated words 'annɯ anat ant + annɯ tʰa nnɯ"))) + (h3 "an unfinished project") + (p + "some background on conlanging and my interst in conlanging software + can be found in this " + (a ((href "/unsettled/1")) + "introductory post about conlanging software")) + (p + "this project was initially intended to function as a sound change + applier: a software tool that takes as input a list of lexical items + in a language and a list of sound change rules and produces as + output a new list of lexical items resulting from the application of + each rule to each of the lexical items in the input. more info about + sound change appliers will be available: " + (a ((href "/unsettled/?")) + "[pending] review of existing conlanging tools")) + (p + "there are two ways in which i sought to extend the functionality of + the typical sound change applier: through feature-based rules, and + through the processing of multiple rule sets at one time. " + (a ((href "https://en.wikipedia.org/wiki/Distinctive_feature")) + "phonological features") + " are proposed binary attributes of phonology that can be used to + distinguish different phonemes. [+/- nasal] is the distinguishing + feature in the minimal pair of phones [n][d]. the processing of + multiple rule sets is accomplished in this project via the notion + of an 'epoch.' at least one epoch must be defined, which takes as + its input the initial lexicon. any additional epochs must have + their input lexicons configured by the user, but they will default + to running in sequence. what this allows is for 'snapshots' of + lexicons between suites of rules (analogous to 'intermediate' + phases in historical linguistics, such as old english>middle + english>early modern english>modern english.) this also allows for + comparisons of different rule sets or the simulation of sound + changes across a family of related languages (analogous to vulgar + latin>italo-western, vulgar-latin>eastern romance, vulgar + latin>southern romance)") + (p + "both of these additional features are present, although the app is + quite buggy and unreliable")) + (section + (hgroup + (h2 "how does it work?") + (p (em "i'll tell you what i remember")) + (hr)) + (p + "i made this a few years ago, right after i first learning how to + write web apps and so i used the tools that i knew a few years ago. + this means that it's javascript! specifically, a react app, where + all the fun processing stuff happens via the react hooks useReducer + pattern. " + (a + ((href + "https://github.com/sorrelbri/feature-change-applier/tree/sj_latl/src/reducers" + )) "all of the reducers are here")) + (p + "at the end of my meaningful work on the project, i started using a " + (a ((href "https://nearley.js.org/")) + "javascript earley parser called nearley") + " as i started conceptualizing the tool as just one component in a + larger suite of tools i hoped to create. the language part never got + very far--writing a language is hard! writing a language when you've + not had significant programming experience is hard! ill advised? " + (a + ((href + "https://github.com/sorrelbri/feature-change-applier/blob/sj_latl/src/utils/latl/grammar.ne")) + "there's the start of something like an ebnf grammar for the + project")) + (p + "this project isn't done! and it never will be!"))) \ No newline at end of file diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm new file mode 100644 index 0000000..e69de29 diff --git a/in-progress/syntax-considered-harmful.scm b/in-progress/syntax-considered-harmful.scm new file mode 100644 index 0000000..e69de29 diff --git a/static/img/settled/1/fca.jpg b/static/img/settled/1/fca.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2d9354c0cc3d56ba0512bfcad4ff266ad64f8c5 GIT binary patch literal 45291 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 literal 0 HcmV?d00001 diff --git a/static/style/styles.css b/static/style/styles.css index 3c076bb..f9a3a1d 100644 --- a/static/style/styles.css +++ b/static/style/styles.css @@ -145,3 +145,12 @@ li.tag-item { margin: 0 6; } +img { + width: 96%; + margin: 2%; + border-color: var(--foreground-color); + border-style: solid; + border-width: 2px; + border-radius: 2px; +} + From c5ad5e7b7bbbeab93a4548854496c64eceedd2ec Mon Sep 17 00:00:00 2001 From: sorrel Date: Thu, 25 Jan 2024 16:26:51 -0500 Subject: [PATCH 02/16] publish feature-change-applier --- {in-progress => archive}/feature-change-applier.scm | 0 data/atom.csv | 1 + data/settled.csv | 1 + data/tagged.csv | 5 +++-- source/feed.atom | 2 +- source/settled/1.scm | 1 + source/settled/index.scm | 2 +- source/tagged/conlang.scm | 2 +- source/tagged/index.scm | 2 +- source/tagged/tool.scm | 1 + 10 files changed, 11 insertions(+), 6 deletions(-) rename {in-progress => archive}/feature-change-applier.scm (100%) create mode 100644 source/settled/1.scm create mode 100644 source/tagged/tool.scm diff --git a/in-progress/feature-change-applier.scm b/archive/feature-change-applier.scm similarity index 100% rename from in-progress/feature-change-applier.scm rename to archive/feature-change-applier.scm diff --git a/data/atom.csv b/data/atom.csv index e022ca0..8aa6e33 100644 --- a/data/atom.csv +++ b/data/atom.csv @@ -1,4 +1,5 @@ title,link,summary,published,updated +feature-change-applier,https://oxaliq.net/settled/1,a first attempt at a conlanging tool,2024-01-25T16:26:10, beginning latl,https://oxaliq.net/unsettled/1,beginning the process of thinking through an environment for conlanging and other language shenanigans,2024-01-18T22:39:00, now,https://oxaliq.net/now,what the author of this site is up to (not computer things),2024-01-18T22:22:03, contact,https://oxaliq.net/contact,how to talk to me,2024-01-18T22:21:26, diff --git a/data/settled.csv b/data/settled.csv index c545860..a5e731c 100644 --- a/data/settled.csv +++ b/data/settled.csv @@ -1 +1,2 @@ id,headline,description,history-> +1,feature-change-applier,a first attempt at a conlanging tool,2024-01-25T16:26:10 \ No newline at end of file diff --git a/data/tagged.csv b/data/tagged.csv index 971be52..b8ba424 100644 --- a/data/tagged.csv +++ b/data/tagged.csv @@ -1,5 +1,6 @@ tags,-> about,root/now,root/contact,root/very-earnest-disclaimer,root/this,root/about latl,unsettled/1 -conlang,unsettled/1 -programming-language,unsettled/1 \ No newline at end of file +conlang,settled/1,unsettled/1 +programming-language,unsettled/1 +tool,settled/1 \ No newline at end of file diff --git a/source/feed.atom b/source/feed.atom index 9002d21..1de0b70 100644 --- a/source/feed.atom +++ b/source/feed.atom @@ -1 +1 @@ -λ.oxaliq.net2024-01-18T22:39:00sorrelhttps://oxaliq.netbeginning latlhttps://oxaliq.net/unsettled/1beginning the process of thinking through an environment for conlanging and other language shenanigans2024-01-18T22:39:00nowhttps://oxaliq.net/nowwhat the author of this site is up to (not computer things)2024-01-18T22:22:03contacthttps://oxaliq.net/contacthow to talk to me2024-01-18T22:21:26very earnest disclaimerhttps://oxaliq.net/very-earnest-disclaimerbeing earnest in the streets2024-01-18T22:20:50thishttps://oxaliq.net/thisthe site this bitch made2024-01-18T22:19:43abouthttps://oxaliq.net/aboutabout the bitch who made this site2024-01-18T21:56:45 \ No newline at end of file +λ.oxaliq.net2024-01-25T16:26:10sorrelhttps://oxaliq.netfeature-change-applierhttps://oxaliq.net/settled/1a first attempt at a conlanging tool2024-01-25T16:26:10beginning latlhttps://oxaliq.net/unsettled/1beginning the process of thinking through an environment for conlanging and other language shenanigans2024-01-18T22:39:00nowhttps://oxaliq.net/nowwhat the author of this site is up to (not computer things)2024-01-18T22:22:03contacthttps://oxaliq.net/contacthow to talk to me2024-01-18T22:21:26very earnest disclaimerhttps://oxaliq.net/very-earnest-disclaimerbeing earnest in the streets2024-01-18T22:20:50thishttps://oxaliq.net/thisthe site this bitch made2024-01-18T22:19:43abouthttps://oxaliq.net/aboutabout the bitch who made this site2024-01-18T21:56:45 \ No newline at end of file diff --git a/source/settled/1.scm b/source/settled/1.scm new file mode 100644 index 0000000..45b5377 --- /dev/null +++ b/source/settled/1.scm @@ -0,0 +1 @@ +'(body (article (hgroup (h1 "feature change applier") (p (em "a first attempt at a conlanging tool"))) (section (hgroup (h2 "what is this?") (p (em "a tool for conlanging: a feature-based sound-change applier\n capable of applying multiple sets of rules at once.")) (hr)) (p "you can try it out here: " (a ((href "https://sorrelbri.github.io/feature-change-applier/")) "feature change applier app")) (img ((src "/static/img/settled/1/fca.jpg") (alt "an image of Feature Change Applier application. visible\n are labeled sections. 'proto language lexicon' is a text\n field with nonsense weirds. 'phonetic features' is a list\n of binary values shuch as '+ back' / '- back' and\n characters representing associated sounds like 'a / u / ɯ'\n / 'ə', 'epoch 1' is a text field with a list of phonetic\n rules such as\n '[+ occlusive - nasal]>[+ occlusive + nasal]/n_.' and\n buttons to 'Remove epoch 1' or 'Add Epoch'. 'modeling\n options' is a single selected radio button labeled\n 'Default output' with buttons labeled 'Run Changes' and\n 'Clear Output'. 'Results of Run' is a list headed 'epoch\n 1' and containing newline separated words 'annɯ anat ant\n annɯ tʰa nnɯ"))) (h3 "an unfinished project") (p "some background on conlanging and my interst in conlanging software\n can be found in this " (a ((href "/unsettled/1")) "introductory post about conlanging software")) (p "this project was initially intended to function as a sound change\n applier: a software tool that takes as input a list of lexical items\n in a language and a list of sound change rules and produces as\n output a new list of lexical items resulting from the application of\n each rule to each of the lexical items in the input. more info about\n sound change appliers will be available: " (a ((href "/unsettled/?")) "[pending] review of existing conlanging tools")) (p "there are two ways in which i sought to extend the functionality of\n the typical sound change applier: through feature-based rules, and\n through the processing of multiple rule sets at one time. " (a ((href "https://en.wikipedia.org/wiki/Distinctive_feature")) "phonological features") " are proposed binary attributes of phonology that can be used to\n distinguish different phonemes. [+/- nasal] is the distinguishing\n feature in the minimal pair of phones [n][d]. the processing of\n multiple rule sets is accomplished in this project via the notion\n of an 'epoch.' at least one epoch must be defined, which takes as\n its input the initial lexicon. any additional epochs must have\n their input lexicons configured by the user, but they will default\n to running in sequence. what this allows is for 'snapshots' of\n lexicons between suites of rules (analogous to 'intermediate'\n phases in historical linguistics, such as old english>middle\n english>early modern english>modern english.) this also allows for\n comparisons of different rule sets or the simulation of sound\n changes across a family of related languages (analogous to vulgar\n latin>italo-western, vulgar-latin>eastern romance, vulgar\n latin>southern romance)") (p "both of these additional features are present, although the app is\n quite buggy and unreliable")) (section (hgroup (h2 "how does it work?") (p (em "i'll tell you what i remember")) (hr)) (p "i made this a few years ago, right after i first learning how to\n write web apps and so i used the tools that i knew a few years ago.\n this means that it's javascript! specifically, a react app, where\n all the fun processing stuff happens via the react hooks useReducer\n pattern. " (a ((href "https://github.com/sorrelbri/feature-change-applier/tree/sj_latl/src/reducers")) "all of the reducers are here")) (p "at the end of my meaningful work on the project, i started using a " (a ((href "https://nearley.js.org/")) "javascript earley parser called nearley") " as i started conceptualizing the tool as just one component in a\n larger suite of tools i hoped to create. the language part never got\n very far--writing a language is hard! writing a language when you've\n not had significant programming experience is hard! ill advised? " (a ((href "https://github.com/sorrelbri/feature-change-applier/blob/sj_latl/src/utils/latl/grammar.ne")) "there's the start of something like an ebnf grammar for the\n project")) (p "this project isn't done! and it never will be!"))) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/settled1.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/conlang") (hx-get "/hx/tagged/conlang") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "conlang"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/tool") (hx-get "/hx/tagged/tool") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "tool"))))) (hr) (p ((class "doc-history")) (small "published: 2024-01-25T16:26:10")) (p ((class "license-info")) (small (a ((href "static/license/license.txt")) "license"))))) \ No newline at end of file diff --git a/source/settled/index.scm b/source/settled/index.scm index 8e1ef4d..6df340d 100644 --- a/source/settled/index.scm +++ b/source/settled/index.scm @@ -1 +1 @@ -'(article (hgroup (h1 "settled* thoughts") (p (em "*-ish, something like a portfolio of projects"))) (h3 "the thoughts") (p "there's nothing here yet")) \ No newline at end of file +'(article (hgroup (h1 "settled* thoughts") (p (em "*-ish, something like a portfolio of projects"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "/settled/1")) "go! to feature-change-applier page"))) \ No newline at end of file diff --git a/source/tagged/conlang.scm b/source/tagged/conlang.scm index 0898022..24701a2 100644 --- a/source/tagged/conlang.scm +++ b/source/tagged/conlang.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#conlang")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#conlang")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#conlang")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#conlang")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "1")) "go! to feature-change-applier page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/tagged/index.scm b/source/tagged/index.scm index 739c5cb..9a463d1 100644 --- a/source/tagged/index.scm +++ b/source/tagged/index.scm @@ -1 +1 @@ -'(article (hgroup (h1 "all the tags") (p (em "a categorical mess for your perusal"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "about") (p "posts about about") (a ((href "/tagged/about")) "go! to about page")) (div ((class "post-preview")) (h4 "latl") (p "posts about latl") (a ((href "/tagged/latl")) "go! to latl page")) (div ((class "post-preview")) (h4 "conlang") (p "posts about conlang") (a ((href "/tagged/conlang")) "go! to conlang page")) (div ((class "post-preview")) (h4 "programming-language") (p "posts about programming-language") (a ((href "/tagged/programming-language")) "go! to programming-language page"))) \ No newline at end of file +'(article (hgroup (h1 "all the tags") (p (em "a categorical mess for your perusal"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "about") (p "posts about about") (a ((href "/tagged/about")) "go! to about page")) (div ((class "post-preview")) (h4 "latl") (p "posts about latl") (a ((href "/tagged/latl")) "go! to latl page")) (div ((class "post-preview")) (h4 "conlang") (p "posts about conlang") (a ((href "/tagged/conlang")) "go! to conlang page")) (div ((class "post-preview")) (h4 "programming-language") (p "posts about programming-language") (a ((href "/tagged/programming-language")) "go! to programming-language page")) (div ((class "post-preview")) (h4 "tool") (p "posts about tool") (a ((href "/tagged/tool")) "go! to tool page"))) \ No newline at end of file diff --git a/source/tagged/tool.scm b/source/tagged/tool.scm new file mode 100644 index 0000000..37095da --- /dev/null +++ b/source/tagged/tool.scm @@ -0,0 +1 @@ +'(article (hgroup (h1 "stuff what's tagged like " (em "#tool")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#tool")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "1")) "go! to feature-change-applier page"))) \ No newline at end of file From af165e5539e044e992785cb6be2ae0b75a54941f Mon Sep 17 00:00:00 2001 From: sorrel Date: Sun, 28 Jan 2024 21:39:54 -0500 Subject: [PATCH 03/16] start writing latl-primitives --- in-progress/latl-primitives.scm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm index e69de29..9067450 100644 --- a/in-progress/latl-primitives.scm +++ b/in-progress/latl-primitives.scm @@ -0,0 +1,14 @@ +(article + (hgroup + (h1 "latl primitives") + (p (em "what will latl provide out of the box?"))) + (p + ;; show some diagrams of what is needed. no pseudocode. + ;; + "") + (section + (hgroup + (h2 "") + (p (em ""))) + "") + ) \ No newline at end of file From 5508d23290fc1e560928f1f94e97d829f629a2e3 Mon Sep 17 00:00:00 2001 From: sorrel Date: Wed, 7 Feb 2024 14:49:11 -0500 Subject: [PATCH 04/16] just checking in a bunch of changes to the *big* latl-primitives post --- .idea-log | 29 ++++++++++++++++++- in-progress/latl-primitives.scm | 51 +++++++++++++++++++++++++++------ 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/.idea-log b/.idea-log index 214838f..9628e05 100644 --- a/.idea-log +++ b/.idea-log @@ -1,3 +1,30 @@ +IDEAS in progress +----- - - - - - - +- root/links +- unsettled/latl-primitives + +IDEAS for future time +_____ - - - - - - - - +- unsettled/that-has-no-name +- - event system +- - story as graph +- unsettled/input-messenger +- settled/go +- - client only +- settled/this-post-is-atomic (oxaliq.net utility scripts and atomicity) +- unsettled/syntax-considered-harmful #playful +- unsettled/ddd #playful +- unsettled/library ???? + +TH' LOG +------- +2024/02/07 +- working through the giant latl-primitives writeup +- should really fix the post id thing before i publish it + +2023/01/25 +- published fca writeup + 2023/01/19 - published about posts linked from index page - published beginning-latl @@ -5,8 +32,8 @@ - links ? - to write next - conlanging-tools - - fca (latl first attempt) - latl-primitives + - what is in a sound change rule? - syntax-considered-harmful ? (playful) - (l)ddd (living)-documentation-driven-development ? (playful) diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm index 9067450..1c088a7 100644 --- a/in-progress/latl-primitives.scm +++ b/in-progress/latl-primitives.scm @@ -1,14 +1,47 @@ -(article +#lang s-exp racket +'(article (hgroup - (h1 "latl primitives") - (p (em "what will latl provide out of the box?"))) - (p - ;; show some diagrams of what is needed. no pseudocode. - ;; - "") + (h1 "what must be true of latl primitives") + (p (em "what will latl need to ") (u "do") " out of the box?")) + (p "at it's base latl is a tool for operating on languages, invented (or otherwise. maybe.) it helps then to think of the sorts of things that encompass language. spoken and signed languages will be the assumed base case language, as those are the things real human beings usually use to communicate with each other. the modality of a language needn't be important to the primitives used, but it's always a good practice to state assumptions") (section (hgroup - (h2 "") - (p (em ""))) + (h2 "thinking about language for a moment")) + (p "by way of an opening query, i'm posing (to myself) the question: what does a human language need? naturally our base case spoken language has sounds and our base case signed language has gestures. for each of these cases, we have an articulatory mechanism (the vocal tract or the hand and arm in relation to the body) and a perceptual mechanism (the auditory system or the visual system.) i'm starting very basic with these assumptions, because decisions made here will have an outsized effect on the ultimate design. it is uncontroversial to suggest that there is a basic unit of a given language modality, a phoneme (historically, called a chereme in sign languages) which, when stung together, produce the basic units of meaning. (more on the basic units of meaning later)") + (section + (hgroup + (h3 "phonemes") + (p (em "what even are they?"))) + (p "as just stated a phoneme is the basic articulatory and perceptual unit of a language. there's , is non-atomic. a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") + (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. there's broad agreement that features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") + (p "users should be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") + (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") + (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") + (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock' without aspiration [stɑk] [- spread glottis] in 'stock' or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") + (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstratctions too much") + (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie "(code "/t/") ", "(code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) + (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") + (code "phoneme = positive-integer * phone { phoneme } ) ; (* a phoneme must be a set of phones and optional (archi-)phoneme *)" (br) + "phone = positive-integer * feature ; (* a phone must be a set of features *)" (br) + "feature = ( value, identifier ) | positive-integer * feature ; (* a feature must be a value with some identifier or a set of (dependent) features *)" (br) + "value = non-negative integer ;" (br) + "identifier = letter, { letter | \"-\" } ; (* lispy identifiers assumed for now *)" (br) + "non-negative-integer = digit , { digit } ; (* from here i'll take for granted the definition of digits and letters *)" (br)) + (p "this grammar is insufficient to the purpose, but i include it to point at the recursive nature of both phonemes and features revealed by the constraints defined so far. an additional constraint must be that features are bound in a global feature system and a featural definition of a phone requires values for every possible feature within that feature system. additionally, a feature value can be any within a bound set where each feature can be associated with a different set; so, [+/- nasal] and [-1/0/1 high] can exist within the same feature system, but any instance of [nasal] must have a value of [+] or [-] and any value of [high] must have [-1], [0], or [1]. the grammar handwaves with non-negative-integer by analogy with enums in many programming languages. this grammar also defines a language that would be repetitive and finicky to work with. instead of optimizing, i'd like to take a moment to consider the phoneme already solved in latl and think a little bit about how they're used")) + (section + (hgroup + (h3 "lexemes") + (p (em "zooming out a little to the fundamental unit of meaning"))) + (p "note! for the purpose of this exploration, a lexeme is assumed to be synonymous with 'root morpheme'." (small " if you don't know what this note means, please be aware that i'm being a little bit of a crank again. if you do know what this note means and are suspicious, run with me here for a sec; we'll get to it")) + (p "for now i'll posit that a lexeme is an ordered sequence of phoneme(s) that corresponds to a productive, atomic meaning. a lexeme MAY be subject to derivation rules which transform its meaning or its role in an utterance, for now called 'derived forms'. this definition allows for any 'part of speach' so long as the lexeme is not derived. taking for granted, for a moment, the category 'word', here's a selection of english words that fit this definition of lexeme: 'a', 'she', 'her', 'for', 'four', 'write', 'right', 'quick', 'quit', 'dirigible', 'abstract'") + (p "included are 'function words' (the closed set of grammatically necessary words without independent meaning) like 'a', 'she', 'her', and 'for'. 'content words' are also included (the open set of words with semantic weight) beginning with 'four'. but of course, i've also chosen these words to illustrate some potential traps. we have some phonetic ambiguities: 'for' and 'four' are distinct in some english dialects, but i pronounce them both /fɔɹ/. 'write' and 'right' are indistinguishable from each other in every english and sound something like /ɹajt/. the situation is tricky in this case semantically as well! this is one sequence of sounds upon which multiple different etymologies (encoding mark-making, correctness, directionality, or politics) have converged. if the written forms are any hint, there should be at least two separate lexemes") + (p "i've also snuck in the pair 'she' and 'her'. traditionally, 'her' is held to be a derived form of 'she' violating our 'root morpheme' assumption. leaving aside the linguistic reasons to consider 'her' a derived form, there's still the question of what plausible derivation rule could turn the sound sequence /ʃi/ into /hɜɹ/? (" (small "the ancestral form of 'her' probably was transparently derived from the ancestral form of 'she', but in this project i'm concerned with how these derivations are obscured by language change through time") ")") + (p "the write/right example and the she/her example, in slightly different ways, both recall the bidirectional nature of language. an idealized speaker *knows* which specific meaning (specific lexeme?!) of /ɹajt/ they are referring to, but their interlocutor must derive the appropriate meaning from context. likewise, a proficient speaker produces /ʃi/ and /hɜɹ/ in the appropriate position within a sentence without difficulty, while a language learner may struggle to hear the connection between the two forms. (other interesting possibilities include using one or the other form in all locations or in random distribution; analogizing the regularity of /hi/->/hɪm/ ('he'/'him') to /ʃi/->/ʃɪm/ where a /hɜɹ/ is expected; or using /hi/, /ʃi/, /ðej/ 'they' or other third person pronouns interchangeably. all of these point at some other juicy stuff that will have to be shelved for now.) this bidirectionality means that latl will need to support the mapping of a sequence of phonemes to an arbitrary number of lexemes, although for now it's safe to assume that a lexeme has only one associated sequence of phonemes. (ignoring, for the moment, variant pronunciations as in 'the' /ði/~/ðə/)") + (p "a lexeme will probably need some additional stuff, tho. at the very least a 'dictionary definition' and, of course, a shorthand, ie " (code "/ʃi/") ", " (code "/hɜɹ/") ", or " (code "/ɹajt/")". there's absolutely more to what latl will require from a lexeme (and users should be able to extend the lexeme primitive to their own ends) but that will have to wait for now") + )) + (section + (hgroup + (h2 "what's in a sound change rule?") + (p (em "using previous work as a starting point"))) "") ) \ No newline at end of file From 4983b40f78ee992095d6c3ce0b1d2ccc737f7cec Mon Sep 17 00:00:00 2001 From: sorrel Date: Wed, 7 Feb 2024 15:10:32 -0500 Subject: [PATCH 05/16] some little proofreading --- in-progress/latl-primitives.scm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm index 1c088a7..3c54bb1 100644 --- a/in-progress/latl-primitives.scm +++ b/in-progress/latl-primitives.scm @@ -12,13 +12,13 @@ (hgroup (h3 "phonemes") (p (em "what even are they?"))) - (p "as just stated a phoneme is the basic articulatory and perceptual unit of a language. there's , is non-atomic. a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") - (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. there's broad agreement that features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") - (p "users should be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") + (p "as just stated a phoneme is the basic articulatory and perceptual unit of a language. there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are ") (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") + (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. as stated, there's broad agreement that phonetic features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") + (p "users should therefore be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") - (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") - (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock' without aspiration [stɑk] [- spread glottis] in 'stock' or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") - (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstratctions too much") + (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") ;; TODO add some ASL images (maybe sound for some of the english bits? + (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock', without aspiration [stɑk] [- spread glottis] in 'stock', or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") + (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstractions too much") (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie "(code "/t/") ", "(code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") (code "phoneme = positive-integer * phone { phoneme } ) ; (* a phoneme must be a set of phones and optional (archi-)phoneme *)" (br) @@ -44,4 +44,4 @@ (h2 "what's in a sound change rule?") (p (em "using previous work as a starting point"))) "") - ) \ No newline at end of file + ) From 09bff636e34882106997a69bb7f2a791be6410e0 Mon Sep 17 00:00:00 2001 From: sorrel Date: Thu, 8 Feb 2024 21:11:17 -0500 Subject: [PATCH 06/16] adding to intro. defining phonemes before diving into features --- in-progress/latl-primitives.scm | 103 ++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 24 deletions(-) diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm index 3c54bb1..f4b0770 100644 --- a/in-progress/latl-primitives.scm +++ b/in-progress/latl-primitives.scm @@ -1,18 +1,41 @@ #lang s-exp racket '(article - (hgroup - (h1 "what must be true of latl primitives") - (p (em "what will latl need to ") (u "do") " out of the box?")) - (p "at it's base latl is a tool for operating on languages, invented (or otherwise. maybe.) it helps then to think of the sorts of things that encompass language. spoken and signed languages will be the assumed base case language, as those are the things real human beings usually use to communicate with each other. the modality of a language needn't be important to the primitives used, but it's always a good practice to state assumptions") - (section - (hgroup - (h2 "thinking about language for a moment")) - (p "by way of an opening query, i'm posing (to myself) the question: what does a human language need? naturally our base case spoken language has sounds and our base case signed language has gestures. for each of these cases, we have an articulatory mechanism (the vocal tract or the hand and arm in relation to the body) and a perceptual mechanism (the auditory system or the visual system.) i'm starting very basic with these assumptions, because decisions made here will have an outsized effect on the ultimate design. it is uncontroversial to suggest that there is a basic unit of a given language modality, a phoneme (historically, called a chereme in sign languages) which, when stung together, produce the basic units of meaning. (more on the basic units of meaning later)") + ((id "latl-primitives")) + ;; brief intro - restate the problem (section + ((id "intro")) (hgroup - (h3 "phonemes") - (p (em "what even are they?"))) - (p "as just stated a phoneme is the basic articulatory and perceptual unit of a language. there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are ") (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") + (h1 "what must be true of latl primitives") + (p (em "what will latl need to ") (u "do") " out of the box?")) + (p "i've talked a little about " + (a ((href "/unsettled/1")) "conlanging and latl") + " previously here. the short version is this: making languages (for theoretical conscious beings) is fun! it's been a consistent hobby and artistic pursuit for me for much of my life. i've had different approaches from making extremely regular languages, to simulating the evolution of a family of spoken languages, to a family of synthesizer languages for a fractured machine society. every language project requires keeping track of a dictionary and a grammar (even if they never become more than quick sketches) and any sufficiently involved project can benefit from tools for generating new words that fit a language's 'phonotactics', generating derived words based on grammatical rules, simulating language change over time. conlanging is a hobby with enough overlap with computation, that some conlangers have created tools for some of these tasks. my own projects have become too ambitious to have my work live in spreadsheets over here and latex files over there and text files with the defintions i provide to web-based tools somewhere else entirely. i want to build on the work of those came before and create a substrate upon which any tool a conlanger needs could be built and in which i can define the entirety of a language in one system.") + (p "at it's base latl will be a tool for operating on languages, invented (or otherwise... maybe.) it helps then to think of the sorts of things that encompass language. spoken and signed languages will be the assumed base case language, as those are the things real human beings usually use to communicate with each other. the modality of a language needn't be important to the primitives used, but it's always a good practice to state assumptions")) + (section + ((id "contents")) + (ul (li (a ((href "#what-is-language")) "go to what-is-language")) + (li (a ((href "#what-conlangers-do")) "go to what-conlangers-do")) + (li (a ((href "#proposed-latl-primitives")) "go to proposed-latl-primitives")) + (li (a ((href "#signoff")) "go to signoff")))) + ;; article contains three main sections: + ;; 1. thinking about language + ;; 2. talking about conlangers + ;; 3. working through some ideas for primitives + ;; --- + ;; section 1. thinking about language + (section + ((id "what-is-language")) + (hgroup + (h2 "thinking about what language is for a moment")) + (p "by way of an opening query: what does a language need? naturally our base case spoken languages have sounds and our base case signed languages have gestures. for each of these, we have an articulatory mechanism: the vocal tract, or the hand and arm in relation to the body; and a perceptual mechanism: the auditory system, or the visual system. the unique thing about language among other forms of communication is how languages use time. it might seem basic, but it's easy to forget that 'my cat scratched the post' and 'the post scratched my cat' mean very different things. and the same sounds in a different sequence can become a smattering of ideas as in 'the my scratched cat post' or even lose meaning all together as in 'cra catsm sde thymst opsh'. languages differ on how they use time--some languages allow freer word order than others, but relationships between articulations through time are essential to all known languages. for now, let's start with those articulatory bits! (more on time and on meaning later)") + ;; 1.1 phonemes + (section + ((id "phonemes")) + (hgroup + (h3 "phonemes") + (p (em "what even are they?"))) + (p "no talk of letters here! no \"'ghoti' is pronounced 'fish'\" jokes! instead, let's imagine how to describe the difference in articulation and in reception between 'mine' and 'fine' and 'wine' and and 'dine' or between ''. these words rhyme! which (for short words) is just a way of saying that most of their sounds are the same, and the similar bits come at the end. it is uncontroversial to suggest that there is a basic articulatory/perceptual unit in any given modality which, when strung together, produces the basic units of meaning. this basic unit, no matter the modality, is called the 'phoneme' (historically, called a 'chereme' in sign languages). i've already hinted at how linguists support the existence of these phonemes. 'dine' and 'fine' together form a 'minimal pair' of words with a different meaning that differ in only one perceptually distinct part of their articulation. human bodies are inexact things--perception is important here! it does us no good to describe an extra-tightly clenched middle finger in a closed hand shape as indicative of a distinct phoneme as it would be unlikely to be perceptible to an interlocutor and so could never disambiguate between two signs. environments are noisy and so articulation is also important! 'fish' and 'shiff' might be hard to distinguish on a windy overlook or in a compressed recording, but they are ") ;; TODO START HERE + (p "there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are " (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. as stated, there's broad agreement that phonetic features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") (p "users should therefore be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") @@ -22,13 +45,15 @@ (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie "(code "/t/") ", "(code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") (code "phoneme = positive-integer * phone { phoneme } ) ; (* a phoneme must be a set of phones and optional (archi-)phoneme *)" (br) - "phone = positive-integer * feature ; (* a phone must be a set of features *)" (br) - "feature = ( value, identifier ) | positive-integer * feature ; (* a feature must be a value with some identifier or a set of (dependent) features *)" (br) - "value = non-negative integer ;" (br) - "identifier = letter, { letter | \"-\" } ; (* lispy identifiers assumed for now *)" (br) - "non-negative-integer = digit , { digit } ; (* from here i'll take for granted the definition of digits and letters *)" (br)) + "phone = positive-integer * feature ; (* a phone must be a set of features *)" (br) + "feature = ( value, identifier ) | positive-integer * feature ; (* a feature must be a value with some identifier or a set of (dependent) features *)" (br) + "value = non-negative integer ;" (br) + "identifier = letter, { letter | \"-\" } ; (* lispy identifiers assumed for now *)" (br) + "non-negative-integer = digit , { digit } ; (* from here i'll take for granted the definition of digits and letters *)" (br)) (p "this grammar is insufficient to the purpose, but i include it to point at the recursive nature of both phonemes and features revealed by the constraints defined so far. an additional constraint must be that features are bound in a global feature system and a featural definition of a phone requires values for every possible feature within that feature system. additionally, a feature value can be any within a bound set where each feature can be associated with a different set; so, [+/- nasal] and [-1/0/1 high] can exist within the same feature system, but any instance of [nasal] must have a value of [+] or [-] and any value of [high] must have [-1], [0], or [1]. the grammar handwaves with non-negative-integer by analogy with enums in many programming languages. this grammar also defines a language that would be repetitive and finicky to work with. instead of optimizing, i'd like to take a moment to consider the phoneme already solved in latl and think a little bit about how they're used")) - (section + ;; 1.2 lexemes + (section + ((id "lexemes")) (hgroup (h3 "lexemes") (p (em "zooming out a little to the fundamental unit of meaning"))) @@ -38,10 +63,40 @@ (p "i've also snuck in the pair 'she' and 'her'. traditionally, 'her' is held to be a derived form of 'she' violating our 'root morpheme' assumption. leaving aside the linguistic reasons to consider 'her' a derived form, there's still the question of what plausible derivation rule could turn the sound sequence /ʃi/ into /hɜɹ/? (" (small "the ancestral form of 'her' probably was transparently derived from the ancestral form of 'she', but in this project i'm concerned with how these derivations are obscured by language change through time") ")") (p "the write/right example and the she/her example, in slightly different ways, both recall the bidirectional nature of language. an idealized speaker *knows* which specific meaning (specific lexeme?!) of /ɹajt/ they are referring to, but their interlocutor must derive the appropriate meaning from context. likewise, a proficient speaker produces /ʃi/ and /hɜɹ/ in the appropriate position within a sentence without difficulty, while a language learner may struggle to hear the connection between the two forms. (other interesting possibilities include using one or the other form in all locations or in random distribution; analogizing the regularity of /hi/->/hɪm/ ('he'/'him') to /ʃi/->/ʃɪm/ where a /hɜɹ/ is expected; or using /hi/, /ʃi/, /ðej/ 'they' or other third person pronouns interchangeably. all of these point at some other juicy stuff that will have to be shelved for now.) this bidirectionality means that latl will need to support the mapping of a sequence of phonemes to an arbitrary number of lexemes, although for now it's safe to assume that a lexeme has only one associated sequence of phonemes. (ignoring, for the moment, variant pronunciations as in 'the' /ði/~/ðə/)") (p "a lexeme will probably need some additional stuff, tho. at the very least a 'dictionary definition' and, of course, a shorthand, ie " (code "/ʃi/") ", " (code "/hɜɹ/") ", or " (code "/ɹajt/")". there's absolutely more to what latl will require from a lexeme (and users should be able to extend the lexeme primitive to their own ends) but that will have to wait for now") - )) - (section - (hgroup - (h2 "what's in a sound change rule?") - (p (em "using previous work as a starting point"))) - "") - ) + (p "before moving on")) + ;; 1.3 morphosyntax or morphemes? + (section + ((id "")) + ) + ) + ;; section 2. okay but conlangers + (section + ((id "what-conlangers-do")) + (hgroup + (h2 "") + (p (em ""))) + (p "") + (section + (hgroup + (h3 "what's in a sound change rule?") + (p (em "using previous work as a starting point"))) + "")) + ;; section 3. introducing the primitives + (section + ((id "proposed-latl-primitives")) + (hgroup + (h2 "") + (p (em ""))) + (p "") + (section + ((id "")) + (hgroup + (h3 "") + (p (em ""))) + (p ""))) + ;; brief conclusion and next steps + (section + ((id "signoff")) + (hgroup + (h2 "signing off") + (p (em "what's next for latl thinking?"))))) From 432b620d8cb9de581acf8443782059f498367d5a Mon Sep 17 00:00:00 2001 From: sorrel Date: Sun, 28 Jan 2024 20:25:57 -0500 Subject: [PATCH 07/16] fix relative path in beginning-latl link to fca --- archive/beginning-latl.scm | 2 +- source/unsettled/1.scm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/archive/beginning-latl.scm b/archive/beginning-latl.scm index 62a7086..59cd9d9 100644 --- a/archive/beginning-latl.scm +++ b/archive/beginning-latl.scm @@ -65,7 +65,7 @@ for a multi-purpose conlanging tool that was beginning to take shape in my head") (p "i tried anyway") (p "and i made " - (a ((href "settled/1")) + (a ((href "/settled/1")) "a bad first draft of a sound change tool")) (p "there's an e-bnf grammar in that project somewhere! the hubris i diff --git a/source/unsettled/1.scm b/source/unsettled/1.scm index 74b73e0..7896e7d 100644 --- a/source/unsettled/1.scm +++ b/source/unsettled/1.scm @@ -1 +1 @@ -'(body (article (h1 "beginning work on LATL") (p "a little introduction to a project i started thinking about in early 2020,\n as i was learning how to do web development and wanted to try my hand at\n combining some hobbies") (p (a ((href "#the-point")) "skip the story and get to the point")) (section ((id "the-story")) (hgroup (h2 "what even is this?") (p (em "a story of linguistics and hubris")) (hr)) (p "so, when i was a wee little child, i discovered language. like, most\n wee little children discover language, but some wee little children\n get given the lord of the rings when they're ten or something and get\n into the narrative and the characters, sure. but those appendices....\n there's .. a language here? called quenya? and it's written in this\n script? called tengwar? and there's a related language, sindarin? and\n this tolkien guy just made all this up? ") (p "so, i did the precocious kid thing and said to myself \"if this dead\n british weirdo (who's like really into the concept of royalty) can\n make a whole new language, then surely i can too\"") (p "i did not, in fact, make a language. i made a relex of the language\n i already spoke (my own peculiar idiolect of u.s. english,) but we all\n gotta start somewhere") (p "for a long time the internet to me was mostly " (a ((href "https://listserv.brown.edu/archives/conlang.html")) "the brown university conlang listserv.") " here i learned about different phonology, what the heck\n morphosyntactic alignment is, diachronicity and how different\n languages can be related. i got exposed to awkwords and sca2 (tools\n for generating words and modeling changes to those words.) but i\n never interacted with ppl much. i was a kid and the ppl in there\n really knew their stuff, and i never much felt comfy with the idea\n of being just " (em "in public") " on the internet like that") (p "anyway i got better at making languages and learning about how\n language works, and it's just been a (sometimes more consistent, at\n times less) hobby of mine for most of my life") (p "flash forward to a few years ago, i'm working on a language that has\n turned into the passion project that i've spend the majority of my\n conlanging on and i'm getting frustrated with my tools. other\n conlangers have made some really cool tools that i've used forever,\n but i wanted to change my workflow. i wanted to do more complex,\n phonological-feature-aware, sound change rules; i wanted diachroinc\n tooling for morhposyntactic bits of my languages; i wanted a tighter\n feedback loop between defining some changes, or lexical items, or\n whathave you, and seeing the results; i wanted to see how a\n derivational pattern at one stage in a parent form of a language\n branches out or collapses into different derivational patterns in a\n child language") (p "all was not well in my conlanging") (p "i would need to " (strong "do some programming")) (p "the thing is, i had just learned javascript. i had built a few\n little toy web apps, and i was not ready to execute on a vision\n for a multi-purpose conlanging tool that was beginning to take shape in my head") (p "i tried anyway") (p "and i made " (a ((href "settled/1")) "a bad first draft of a sound change tool")) (p "there's an e-bnf grammar in that project somewhere! the hubris i\n had then, to think i could make a little javascript-backed\n language tool with all of the bells and whistles i needed! with\n the knowledge that i had then! (or more accurately, didn't have)") (br) (p "but now...")) (section ((id "the-point")) (hgroup (h2 "reviving this project") (p (em "whatcha gonna do sorrel?")) (hr)) (p "i'm still not ready") (p "but at least, today i'm forgoing bells and whistles for\n execution models. core abstractions. experience using " (a ((href "https://racket-lang.org")) "a (programming) language-oriented programming language") " maybe. there's a lot to think about") (p "so, i'm going to try reviving this project. or, more accurately,\n reimagining this project. from the little sound change tool that\n was merely an unusably buggy iteration on tools that other\n conlangers had executed better, to a more robust environment for\n conlanging. one which gives language nerds the power to solve\n all of their language nerding problems in one runtime, with an\n extensible and reflective interface. and which is written in such\n a way, with the appropriate abstractions, that lanuage nerdy\n hackers can hack their own tools on top of it") (p "and i'm going to be doing " (a ((href "https://www.recurse.com/")) "a hecking hacking retreat") " about it. i'll spend some full-time programming days making a\n goofy little thing for goofy little language nerds surrounded by\n goofy programming nerds doing whatever rad things they happen\n to be getting up to when i happen to be there") (p "like many of the communities i am a part of, i am a quiet part of\n the conlanging community. so, we'll see how this goes. maybe it\n is only ever something of interest to me and the conlangers i\n interact with in meatspace. maybe it only teaches me some things\n about designing and building a tool of the type that i'm designing\n and building. hoooopefully it is helpful in a way to other\n conlangers such that it evolves beyond what i could do on\n my own (cause i ain't no whiz kid 10x programmer)") (p "but that's all me getting ahead of myself (as is often my wont.)\n first! to pack for the trip!")) (section (hgroup (h2 "packing for the trip") (p (em "a biggg heap of things to expand")) (hr)) (p "i'm just gonna fly right through these. there's going to be a lot\n to read up on, to explore, to think and talk through, to build\n toy versions of before it gets time for larger prototyping and\n building a workable tool. so, here's the very start of the\n thinking-in-public. each of these little thoughts is going to get\n at least it's own writeup (if not several) and i'll update with\n additional sections and links to the writeups as i go. a note: it\n would be impossible for me (and probably most ppl) to create the\n full vision in the time i'll be working on it fulltime") (section (h3 "notes on the goals") (p "it's good to have goals! to define what it even is yr tring to\n do. so here's my attempt. my goal is to create a foss+ working\n runtime that *can* serve as a singular tool for conlangers with\n some basic programming capacity. it should be linguistically\n *theory neutral* to the extant that such a thing is possible.\n it should allow for the definition of all relevant structures\n of a language *in code* and support the construction of grammars,\n dictionaries, text documents and (stretch goal) non-programmer\n friendly tools *from code*. it should support phonological,\n lexical, syntactic, morphological, semantic, etc transformations\n across different 'epochs' be they diachronic or synchronic.\n these transformations should work on transformations, ie\n morphological transformations should themselves be transformed\n by phonological transformations. users of the tool should be\n able to edit their work and see the consequences of their changes\n quickly. hopefully, this can all happen on the web, i guess,\n cause ppl like using their browser as the everything app")) (section (h3 "notes on existing tools") (p "i'm going to talk a bunch about existing tools made by\n conlangers or made for professional linguists and used by\n conlangers or just yr regular old spreedsheets and such. i'm\n going to be doing some research about how conlangers do their\n conlanging, lest this truly be a just-for-me type project")) (section (h3 "notes on primitives") (p "i think some interesting things start to bubble out of some of\n those goals up there. like the idea of supporting a bunch of\n different kinds of transformations that should themselves be\n transformable. the primitives we're working with have to work\n below the level of \"lexeme\" or \"phoneme\" to have something\n abstract that can apply to both. i'm not going to get into\n specifics even a little bit at this point-you'll have to stay\n tuned for more")) (section (h3 "notes on execution model") (p "this is going to be the crunchiest stuff to think about. i'm\n going to make some arguments for some things that (it is my\n belief) fall out of these goals. things like dynamic typing.\n things like reflectivity (this is sooo important it gets its\n own section.) things like lazy evaluation (because languages\n are big and sometimes you only want to look at a subset of a\n language.) there's also some hypothetical notions that will\n require some experiments to determine applicability to the\n project. i'm just going to list them as questions and not\n expound upon or defend their existence as questions here:\n propositions as a means of combination? propagation networks\n as primitives?")) (section (h3 "notes on reflectivity and interaction") (p "this is so important! i want conlangers to use this tool to\n iterate and that requires ~something like a REPL~ in a\n dynamic environment. my dream is to have a bidirectional\n flow of information; whereby a user of the system can define\n some rules about their language, evaluate those rules on some\n data in an interpreter, inspect those data, modify those data\n and run the interpreter such that it produces possible rules\n that would yield the new result. wether or not that experience\n results from the project, users should be able to rebind\n anything their project needs *at runtime*")) (section (h3 "notes on portability") (p "as the project develops i will have to give some thought to\n how to make it available to conlangers with different kinds\n of computation experience. the ideal would be for a full\n featured web implementation that interoperates with hosted\n implementations, but we'll see")) (section (h3 "notes on the substrate") (p "not a lot to say here. i will begin this project in racket\n because i have some familiarity with it and it is\n specifically built for developing languages. i will be using\n other tools to explore other aspects of the project and may\n ultimately move away from the racket ecosystem, but a girl\n has gotta start somewhere"))) (section (hgroup (h2 "about the name") (p (em "it's pronouced ˈlæ.ɾɫ̩")) (hr)) (p "i don't know dude, naming things is hard. it's a working name,\n it works good as an extension. " (code "my-conlang.latl") "anyone?") (p "i also just like syllabic laterals? they sound neat to me. the\n official initialism is " (u "l") "inguistic " (u "a") "nalytic " (u "t") "ransformation " (u "l") "anguage, but it also double\n entendres to " (u "l") "ower " (u "a") "nterior " (u "t") "emporal " (u "l") "obe, so that's just kind of fun.") (p "and the l means there can be lambda iconography-this is crucial\n for a new computer project. [ˈλæ.ɾɫ̩] as a typographic image is\n so perfectly specific to the kinds of things i dream about.") (p "maybe it'll have a different name some day, idk"))) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/unsettled/1.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/latl") (hx-get "/hx/tagged/latl") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "latl"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/conlang") (hx-get "/hx/tagged/conlang") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "conlang"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/programming-language") (hx-get "/hx/tagged/programming-language") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "programming-language"))))) (hr) (p ((class "doc-history")) (small "published: 2024-01-18T22:39:00")) (p ((class "license-info")) (small (a ((href "/license")) "license"))))) \ No newline at end of file +'(body (article (h1 "beginning work on LATL") (p "a little introduction to a project i started thinking about in early 2020,\n as i was learning how to do web development and wanted to try my hand at\n combining some hobbies") (p (a ((href "#the-point")) "skip the story and get to the point")) (section ((id "the-story")) (hgroup (h2 "what even is this?") (p (em "a story of linguistics and hubris")) (hr)) (p "so, when i was a wee little child, i discovered language. like, most\n wee little children discover language, but some wee little children\n get given the lord of the rings when they're ten or something and get\n into the narrative and the characters, sure. but those appendices....\n there's .. a language here? called quenya? and it's written in this\n script? called tengwar? and there's a related language, sindarin? and\n this tolkien guy just made all this up? ") (p "so, i did the precocious kid thing and said to myself \"if this dead\n british weirdo (who's like really into the concept of royalty) can\n make a whole new language, then surely i can too\"") (p "i did not, in fact, make a language. i made a relex of the language\n i already spoke (my own peculiar idiolect of u.s. english,) but we all\n gotta start somewhere") (p "for a long time the internet to me was mostly " (a ((href "https://listserv.brown.edu/archives/conlang.html")) "the brown university conlang listserv.") " here i learned about different phonology, what the heck\n morphosyntactic alignment is, diachronicity and how different\n languages can be related. i got exposed to awkwords and sca2 (tools\n for generating words and modeling changes to those words.) but i\n never interacted with ppl much. i was a kid and the ppl in there\n really knew their stuff, and i never much felt comfy with the idea\n of being just " (em "in public") " on the internet like that") (p "anyway i got better at making languages and learning about how\n language works, and it's just been a (sometimes more consistent, at\n times less) hobby of mine for most of my life") (p "flash forward to a few years ago, i'm working on a language that has\n turned into the passion project that i've spend the majority of my\n conlanging on and i'm getting frustrated with my tools. other\n conlangers have made some really cool tools that i've used forever,\n but i wanted to change my workflow. i wanted to do more complex,\n phonological-feature-aware, sound change rules; i wanted diachroinc\n tooling for morhposyntactic bits of my languages; i wanted a tighter\n feedback loop between defining some changes, or lexical items, or\n whathave you, and seeing the results; i wanted to see how a\n derivational pattern at one stage in a parent form of a language\n branches out or collapses into different derivational patterns in a\n child language") (p "all was not well in my conlanging") (p "i would need to " (strong "do some programming")) (p "the thing is, i had just learned javascript. i had built a few\n little toy web apps, and i was not ready to execute on a vision\n for a multi-purpose conlanging tool that was beginning to take shape in my head") (p "i tried anyway") (p "and i made " (a ((href "/settled/1")) "a bad first draft of a sound change tool")) (p "there's an e-bnf grammar in that project somewhere! the hubris i\n had then, to think i could make a little javascript-backed\n language tool with all of the bells and whistles i needed! with\n the knowledge that i had then! (or more accurately, didn't have)") (br) (p "but now...")) (section ((id "the-point")) (hgroup (h2 "reviving this project") (p (em "whatcha gonna do sorrel?")) (hr)) (p "i'm still not ready") (p "but at least, today i'm forgoing bells and whistles for\n execution models. core abstractions. experience using " (a ((href "https://racket-lang.org")) "a (programming) language-oriented programming language") " maybe. there's a lot to think about") (p "so, i'm going to try reviving this project. or, more accurately,\n reimagining this project. from the little sound change tool that\n was merely an unusably buggy iteration on tools that other\n conlangers had executed better, to a more robust environment for\n conlanging. one which gives language nerds the power to solve\n all of their language nerding problems in one runtime, with an\n extensible and reflective interface. and which is written in such\n a way, with the appropriate abstractions, that lanuage nerdy\n hackers can hack their own tools on top of it") (p "and i'm going to be doing " (a ((href "https://www.recurse.com/")) "a hecking hacking retreat") " about it. i'll spend some full-time programming days making a\n goofy little thing for goofy little language nerds surrounded by\n goofy programming nerds doing whatever rad things they happen\n to be getting up to when i happen to be there") (p "like many of the communities i am a part of, i am a quiet part of\n the conlanging community. so, we'll see how this goes. maybe it\n is only ever something of interest to me and the conlangers i\n interact with in meatspace. maybe it only teaches me some things\n about designing and building a tool of the type that i'm designing\n and building. hoooopefully it is helpful in a way to other\n conlangers such that it evolves beyond what i could do on\n my own (cause i ain't no whiz kid 10x programmer)") (p "but that's all me getting ahead of myself (as is often my wont.)\n first! to pack for the trip!")) (section (hgroup (h2 "packing for the trip") (p (em "a biggg heap of things to expand")) (hr)) (p "i'm just gonna fly right through these. there's going to be a lot\n to read up on, to explore, to think and talk through, to build\n toy versions of before it gets time for larger prototyping and\n building a workable tool. so, here's the very start of the\n thinking-in-public. each of these little thoughts is going to get\n at least it's own writeup (if not several) and i'll update with\n additional sections and links to the writeups as i go. a note: it\n would be impossible for me (and probably most ppl) to create the\n full vision in the time i'll be working on it fulltime") (section (h3 "notes on the goals") (p "it's good to have goals! to define what it even is yr tring to\n do. so here's my attempt. my goal is to create a foss+ working\n runtime that *can* serve as a singular tool for conlangers with\n some basic programming capacity. it should be linguistically\n *theory neutral* to the extant that such a thing is possible.\n it should allow for the definition of all relevant structures\n of a language *in code* and support the construction of grammars,\n dictionaries, text documents and (stretch goal) non-programmer\n friendly tools *from code*. it should support phonological,\n lexical, syntactic, morphological, semantic, etc transformations\n across different 'epochs' be they diachronic or synchronic.\n these transformations should work on transformations, ie\n morphological transformations should themselves be transformed\n by phonological transformations. users of the tool should be\n able to edit their work and see the consequences of their changes\n quickly. hopefully, this can all happen on the web, i guess,\n cause ppl like using their browser as the everything app")) (section (h3 "notes on existing tools") (p "i'm going to talk a bunch about existing tools made by\n conlangers or made for professional linguists and used by\n conlangers or just yr regular old spreedsheets and such. i'm\n going to be doing some research about how conlangers do their\n conlanging, lest this truly be a just-for-me type project")) (section (h3 "notes on primitives") (p "i think some interesting things start to bubble out of some of\n those goals up there. like the idea of supporting a bunch of\n different kinds of transformations that should themselves be\n transformable. the primitives we're working with have to work\n below the level of \"lexeme\" or \"phoneme\" to have something\n abstract that can apply to both. i'm not going to get into\n specifics even a little bit at this point-you'll have to stay\n tuned for more")) (section (h3 "notes on execution model") (p "this is going to be the crunchiest stuff to think about. i'm\n going to make some arguments for some things that (it is my\n belief) fall out of these goals. things like dynamic typing.\n things like reflectivity (this is sooo important it gets its\n own section.) things like lazy evaluation (because languages\n are big and sometimes you only want to look at a subset of a\n language.) there's also some hypothetical notions that will\n require some experiments to determine applicability to the\n project. i'm just going to list them as questions and not\n expound upon or defend their existence as questions here:\n propositions as a means of combination? propagation networks\n as primitives?")) (section (h3 "notes on reflectivity and interaction") (p "this is so important! i want conlangers to use this tool to\n iterate and that requires ~something like a REPL~ in a\n dynamic environment. my dream is to have a bidirectional\n flow of information; whereby a user of the system can define\n some rules about their language, evaluate those rules on some\n data in an interpreter, inspect those data, modify those data\n and run the interpreter such that it produces possible rules\n that would yield the new result. wether or not that experience\n results from the project, users should be able to rebind\n anything their project needs *at runtime*")) (section (h3 "notes on portability") (p "as the project develops i will have to give some thought to\n how to make it available to conlangers with different kinds\n of computation experience. the ideal would be for a full\n featured web implementation that interoperates with hosted\n implementations, but we'll see")) (section (h3 "notes on the substrate") (p "not a lot to say here. i will begin this project in racket\n because i have some familiarity with it and it is\n specifically built for developing languages. i will be using\n other tools to explore other aspects of the project and may\n ultimately move away from the racket ecosystem, but a girl\n has gotta start somewhere"))) (section (hgroup (h2 "about the name") (p (em "it's pronouced ˈlæ.ɾɫ̩")) (hr)) (p "i don't know dude, naming things is hard. it's a working name,\n it works good as an extension. " (code "my-conlang.latl") "anyone?") (p "i also just like syllabic laterals? they sound neat to me. the\n official initialism is " (u "l") "inguistic " (u "a") "nalytic " (u "t") "ransformation " (u "l") "anguage, but it also double\n entendres to " (u "l") "ower " (u "a") "nterior " (u "t") "emporal " (u "l") "obe, so that's just kind of fun.") (p "and the l means there can be lambda iconography-this is crucial\n for a new computer project. [ˈλæ.ɾɫ̩] as a typographic image is\n so perfectly specific to the kinds of things i dream about.") (p "maybe it'll have a different name some day, idk"))) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/unsettled/1.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/latl") (hx-get "/hx/tagged/latl") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "latl"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/conlang") (hx-get "/hx/tagged/conlang") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "conlang"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/programming-language") (hx-get "/hx/tagged/programming-language") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "programming-language"))))) (hr) (p ((class "doc-history")) (small "published: 2024-01-18T22:39:00")) (p ((class "license-info")) (small (a ((href "/license")) "license"))))) \ No newline at end of file From fd9152ab0e9179562b0109651f7d60db43eda0f3 Mon Sep 17 00:00:00 2001 From: sorrel Date: Wed, 31 Jan 2024 15:39:42 -0500 Subject: [PATCH 08/16] shrink fca img --- static/img/settled/1/fca.jpg | Bin 45291 -> 21036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/img/settled/1/fca.jpg b/static/img/settled/1/fca.jpg index e2d9354c0cc3d56ba0512bfcad4ff266ad64f8c5..b7b49565d986cbc1565490536d8d5f51fd041c77 100644 GIT binary patch literal 21036 zcmdVB1zc6j+Bm#+(BWp&z3GtHq%@oE1_h;Cq(cRf?rs5TkP?+p#6an85J9D-L`p!B z{1)mt=bn4djrV@<_x*qWnYGtE^VB@^%rmoQ#Xg-lodpo;%4*601Of%bzzm$uL#x#k z6fAW0b(GaKl|TXjKnt90T)g0D0B~{j_S9FAM;V)3M&Yag5P%UN1DF72D;qC&IbB^% z;Gd?i;~+PfMtRS4{ZqETCJ@=$dD#E}1O<{YHtwF@AZ!W3qBp$V&)`fDCbMz0vIXHP z5a#g&4FutdGraXr`12X;@B@Z|AVB76sILI_jSPfQ4u1n%{|#*8=;;FT2!lMVwl1!q zeyH(J*!B$eKZ9MIeL&lOq_Z9p+PNATfF&#VqXSd`H9!l{1yF!B-~(I*oB?lu7c5;t zj2EB}(&hh&Jk1YzT~Nvzl)4JofD(#;8{h(1{g4OF#sK62(;vR|vKJEkfr1dq0|3_a z>FEv|0N|toz;V*)>0#mN>2VPNz&-##lj|SyZUq1!wg=*q{=l*31Hid30H|;K1802) z0G>ty0M(?sm8aE@c3|KcYHtq!U&;W0$OHgLhX4To%1^(6v@<$T{1yNVL0@V113*?b z0I)lNx=sH{zi~l<-~IM4d4Bot^gW;eFp^W!Qj#*#Qq!_9F|zV$3G#7s^O-BCh-tZ5 z`*^unJ3HNqsmZt%S{CNyoIRXVR{yf2tK&x6wI3_P9b^7eCCB z(HqI*tr|4S7JkpT#uyBzf0Lezheyp1T7{5?fT7y*B!g}vM|?`mD~M=v zCgFoi{}=c_m#5U{NoQU!FmVuj4vqxO9nwJ41R!(OsvG{f3;?-}DViQP* zzT0h7zH2%Qz)M#;1K5}L!QO%%$cD5z~z=iv%mx_JEQtry z)6I)D`#RvG8KVZ%nATIK2;vefr&P;%CU1BNr-Lq2-f=DtA4-R+V%@u<}>fbnD z%#d?NrN!*nU%E>(dCAv&lBz?sYvba1!!OKT>SqfsyPN>LjTE8zr$QYCQsC8jirUZS z$cn%YYUU{SAW<1f08vW_fIVrJOl`w6)oOCjAgqFOk|YCnjf(&s;i?O03&w+ze3e}+ z&*TN;u|OD1KamjEixPs-8PD2gK{x7AXj7R~lSYgb1ey3;@Y?mVU)BbKTy{;6)4q1q zlSVH`T4|~v#eieStYb&CvR(l=Oe;%iW_)Jd^x*RLBjwora8xa;9n<9x=e0o`ybit) zq6Yvp4G2K=lLKv1#-&BQJ7rugEBX)moV-mspP9(`_&oEJ_!eiz=i@!uS!1W45R3t^ zcX!nJ?nn|wEH(Ym{JX`MtRA$g@{Oawv3iC~*S{i2liITz1k|3~@;%^eEdwy3pIqWE zWtpS|yO1J!vCh|4UO^JD>%PFx=qkL;j{nob_bX4CaJ$HUt}hU=o-?n*>`~Q*FVvAy zKih*mA5%a<>cY2`KlF(6X5e*I;9czaq(|m7RbrM-v0iY+9Kr38<_O9;5a(2cAJW}F zUr_Kv6tCmVHvnsVF)PaptORgbhd5VImh)?&*#QE#r98r}md1;AwG+@jBs!E(DQqh-!>H7j6l2((i?2Euy{>RP^`S010BBak_`) zyk~1Z0hVj7`6V4ea3W}p^PM%DQ!Eou^u6;C^sbE(`8h$1U^K5Bs0!ye~R!ZFXO9a5XI{)E%A7~$l^QD6%n%DNg~tY2IlDDv#t?gQ`!yi3e2LH_GL z+djTKQn5&C(TBn|-r0oR-;ZC?^D4Xw`m?gL+WYe(sIwAJ8H{oQw~r3@iM;;lN(Xr+ zL|I$LA8k;?W)jFHOfC!`BE@Jy{-$`hq^NtQ?k^J?iMU~OK}7*aa^|GH@k5^?T=gf< zu$*eZt3fi&*;?iNmtwyo)0BpCJsxz`mW0{SpbR&xiZ9;|{FPmB{xJ zIGh@Ci=*F()lWDr{hU1iLR|9Z3lE9Ny8_|K!*}n~6XrQ*vkVp;NM9lP7cxIc*t6MC zN4x^|plqlwI7a_2K@~BsFwGz9A9xYFUe&C1n23mbeV(VlD%b0MnRZgyziL=jK+fgQ4qYU71vzr zkBNVZ3@%`Ka^ED!aCc{Km$q)0()?Qf`7*X;AD5hj?4`=9l`0m$98R2fo43f=@-LK` z81FG$N!y*a{B=C-V<_&W_r5s2ZkWs8qtv7HUjCtetPwEtOB3(Ab))OLe`VG`D2Kdw zO4eGI)ASF7|1*d{aHD!20YITp2oxI%Ze4$DWg!3w63T=Yz>uPt1rabyU3oe8AR(3{ zaPNu>azL=4r-0-wKwG}FG@}S(^zDFc9G0XU?>@rDTwIyBF0NDH&f87+ zM}gt&xi|0}JgUXx6-Gx|AT?=i6z`lxYjenlVnLFu z#M21tXphJerGyg2T6a6^J46x}5EzOODUOMIf3aR-k`BZtQ5fa)@gkQNih5J~xjEt# zSg>TZzJQ5S$Y+q5+bI16=~9-_WqUL?5};Y?d%aiU%k1*d35_QX^`2_djV!pQRT69v z{r<=$#!BQi|F_Q6@?G)0FTuRGIAzIs0yfU^pfs@Jn`NBo`a&nB8eHE8J{MR0*vaWI zBJ?K5D|ji7DeeicMl}n^*g?*N*tn0~wzVca85(RU-L|hgs}qL;Eu_V*A|y%DF5vcO zQKot?@|kEvhqfR2wlX(q5NieQqOjp_%45O~J7k_m2tzTSRqB)k>a`^pVWMrYE&W)5 z_7NvCXe@cDy)U%+n66QbN)#*k3SL7N`HQSHI~cv4`v z-3dl^&l3Dn-Wu%@+Lb17HXYHa!l)fDJLOef53Z_t1S~{QS^fF2NfBTCdMFc+Pd2 zXm5PD;QGt#tF345qCEtEVa!gTF@?vzUH!DFQ0sa28P7AbqXG4@G>nL{tHDKTE<-T;T;=qhpX z$Z-Per2`2abCx$VPU75gYEG9wg%_#@Pa}*u+X^%u&&&HvAl1d%ltMfydLP+~^Tidu zuwVZWmq4hOurkJi9o>PGO37mrWDE14grSrk080dd*NW*D;^ytcEBvm9W=NxX&7wFs z=dlr1HO^Nk+H1bdTZs?i>?!E7ZS85%NgFy^$3ebcG#KU4<`e62eexvFXs#yqWA=~P7=hl~8a zCO4roLb$PYX<~BZdO|$E`LxOP%6eam^XQ{Z%UV}Kp}Ws)c(%}eA2Y@REH1Y9L7M9| zYy`om)M<}JzwZ;^n2q|9AQ6&;T3G8-Hp^T*p{XyS_7obFv9x-Pv&}(c_10iDUNw5m zp_*l0@oJ8}(rux)pOZD8FOz-|8#JE?c!ejzt3i#v{4tAo;l6&e(`7PiwM5OUR5agJ zsJ~rrO`4DM_CR_N(cqw1>LSEgvFGaSTk1WdpO*N%I>LZch{KTGGg>sxzc}vjg;lrU zdP?_gwG2)7bFS#sQL55c&U6Qi;-H=~67ZC9TacewSxx9&C{Y8h5LQUDWwkL61;O6| z{CjP;r>c(&7NvthnLFC(A(3;FogvIlG?DynX?WLqWCWsunrtZ1H1kcC;tKiApU=Ih zKY3QLqd-%!11<+&uubeT&JKs!uQa(5-m9Z!+J7ocm${a36jv6TrCwiT;b?8&+V+>S zI7j)9z-N*>8_Z%h{q*_6U%W#GYS$#|IJ&`>D z8y;NG5rGV8KC^49U65tj*ihUId`Jo&v$6h0vxx&W7{R`m09={&wSCcMej($;X)gx~ysKsGKwk#(1?& zO98XIv0m_mhw=Tfz0fP(ZI@W*vqAoCu=ihI#{}>2)b{dbIXvy;bp0SseRPLDJ0d@| z+xA2&I@EGN_DBl6qO*|z5Eu*&!TNDEKigS=S9GW@l2nfg1+%hr4?+vb{kWEc*LzvW zel3cmB0AYHPPuDrgSi4h#bV%P7&XE2>E;Riwhn2va%tyE0C8R-H8$>8o7#M@pL^0I zO=hsvLDLhlVKaL2Vemxpj&F!2fn7Y|{dJR`fs1xIRf`P0<@4|zsc<^YTXA3*>FCH( zM0vxE4ixUo-(1O);7EwN92hgKYTKR4u332gqIK=Qi9gRP3JU^(Z|}iAaF75{2pkH5 z!GAnv{Lu*#CZsL`iXue|Fk@grf|l;VKY9T@>&20Y8yB_mm*g}z(Vq0UD=T}fuTpvz zsP*sp=)byqes8dtY1OYUj&uy6To6K_iZU}HSj$(I=hRK{VNGeoHh_04;d_VR?oyv$ z%LZjrD_B$9cZO5CDJl&gX3$rad|TWcdA<;N?KOMJi|8B34Ym&&4LLM7eK-3J<4=Jw zMwd(HsIJ7uMt60pjeQDCxkc&0H*ePVjFNdV;V}PUxo)AB$JZkR1+S!l_Pz>(kN&Zl z`E4oBEA%}WSZ@weFGx8=Q;ZO3oTb3V*I@T~!A%(i3de#&VLzX8nV`Qvl0}>B{pW zt$p-2(t$`HwQU8cAARRFFTFAxw^`$%jcXb1bH*c~;H1xQsFYnES15aSdDfd`OwZx! z;-{_AnEXd?N>bD)#rCE5Ex1aoHu!Bgk!Z@NpI;3x+lM#AtuJSIj9PV%Ne~pQWkr7O z;J!jML-$52PB<&^(Swn@W2oESsv$UCBD;!8xdpM8+y){d$Bgmc6vD5N%Mq6#8E!0Ze?D^{ct_y&aG(|Q{|p3$JA7A zjrGb|8-+~gU_>`=e0=ac9a$lok|Kd0%K)#Ga+5meGUs@{Bq0C8^Rz~+=F2ATe4$Nc zr0+LwE0x|#7}2VED}b;4DV;p)odK)W^RLsnYhLw!#GfudVc)SE8G35|{_$1wPn5NY zz2lh_fmuCvC0S;Hr_Mftg7p{Mj6#WV>UTFsC*dURaKw4T2lv}R1sgKd3{R%gq%z6s z=2vbpzKvdQl$^f1@VLX)&R?v0!tVws;=@u9`PO`kDXGg=kQ$DV`*{#XC@>{A>~5x+ z=WbLUnr+B-R2YVcF;ST~=2yOTIH!@K#`-r0#}HL=MEY0=F6!q|#`}tz@`24~Yg;Sl zL`l9$YTT~vVsPrIfrG^g9w}B`kM_p?M#0}IlS;?&q@b#?6zaI=srhTm+}GE4Lik$- z!9P_&;#vBx(kyEJF*UxL+wyzBee0a&kSD57eBDn^HrvE;*il= z-ShoYWWV6wY{_daww{YEWL}yL;n`v?k|K;d1@2yZgblw!=n_oR=W+@ZH<`EYZL-~@ z_u`B(q4!DqNO+rtc5W@sXHw-LCF5d(acgGzFXzD#Rx6o)&*$?*nyJk6E{o``;ijmu zA;D-><4jS~#yjh6t_DjsN7mXYKz6nO@SWY2fvY$S{@ZOCgalv`(37)DMtc+@FsNjD#-|pt@>7RS+y}I4E~A!P^9Z6ZmVS)hSMTga)J zX-+_UQJTa$1TONyNe@4$gvd0}nMj3Utfk%#?+D|9$2vIo(S7jAEni(hT8!#iCLY!Z zvfh)dt#w(5)0_yaAl&XHjJl0oez7&^E;gqkX$cJfbuxs=QG<{AV;qyZ1PO{JNFyc~ z(TUEQ4*b>tX~ZXm3Twj%Q1b?1hKdpty>6W3g^p1D4xZ8JKd4kU_?T6p17P zoEvxr*eMSRncJy}*@8y5dEXNt(}6sGlM;*Lz$jtQ#d$xITv$wSPY=YBkrRdR$KWOI zyTD??Tga9QhzViUcJUw3*plK>g+V;b^(W>m@33QZ&{ZN!JSA?K0E)>%$E+zzK_-=B z?s~R+(1}%0JtYxQI^gMuicICwYZwtTMClPwya19DZ+u?hk~lCAi<&v9M_`!*X~&m3 z_n{JnLS3ghVJMy^4j@SNrGq2uZL7t7AG|R|mPqQcHd=J-4QC_)Nyb7KDXjrjp~#+l zZ*0xo9l;}EUD}v3TZ!`E$yl2kQ#IFd<`!hr0%Q1_A<>-imVoj%Vzc(rT}*R`ZXXlX zj%@2*t0rT3leL60R4*vDD)2gnn(S6V0vwaeL56+3paFL9`W-IOlHC>-!kW@n<+2Qu za(t2NDR7-iPO^YZL1|DAqEKT`!Tyjl^&nX9PzgGbE>0rO2?OFa^y}KR@03*Ex*4R= zQ7IfudUwRjPuoqce^tDZ<3h>OZq9V-8A@L5)oXZC7t8agea9^f12b2fK^Rh{p05y2 z{_Iy9h*-)976Ql-cj813Z}{%-3$fw?v4qEt=rAK6AKYevi-uSn=hPagsxaw~KdvG; zKb+tNJL+NC!yhT)HosUE|GIv#qTu>H(QGc{IPIAVdmxXn6w6bC(%nI zBG;d!nMbYnxJCEE#Ulm1*m}kL)#gOPqjqo=fN9sy_rz0^#S!^z;swmKuNGLag{r#a zE8^CKKd;dm4|UhZtr z;#XA_kDyj;243a(%T{yi_6D^@g-Mn)$=i}txWj5>t87(podPpgj2#@Y@N${l-zZa! zJ;t7EDa0*DsB*SSh^1S>gOEy1Ror^d&2>|HpvHzicB6&07Unm90d6Rq5DJtC(*TlZFXj@v-L5Hc{940 zLrR|ffaL)rDI@Xh6Rap6C$jkqnIQ=U6dk6*@>skfpOYZyO9fF6UW8*w#x|g%$BE+u zlCd3_iuVYkAj>HQA@yAJvs|vO=1lTHAFUkaR?XHrVJpVA1ryh&fau^k()5@7#*gzn z>j^+;4sUM^gVI~`c#d^7(TA%76W!O%vM z8RL=qj@e#@zAzIYjPGN^C3vu0+MRNzt+Vx&qT<^doO)^XK~}ieUN$k~ycA^i=|%xo zg24A6H%d3Pr^aEvgR0Ab5qH$>p}WJvIQ!ueZG`%cdRg}=Mkygw!dK9dCYLh;amm$K zmS|^7jcu+5Ux=b`ZLq328NSv6_CbWc&%wmz<%Rs{#7Os*=U$}isYEbXj)2w7eDPjf zv}&soc8uV_*alq`8(j;xPaDO+mRit;5TiGeNVBldUs3@b#v02ZglmNbF?o}fG6P!O z(CU7Vta`mKs~%O^s(OG++<>pocZ-=Qv?54-oQ$ppl1brjjlNK)I~@gu&dRE90^$Qq zgJXhB`UIA7rGO*`W3qVeTDu7#Y63)f)JZmMF2VDXV!l*c&#CVz%;3q391JPia2U?rDZw3twY5A>OL@@z6bBl7t4MS=BqX z!umKLeN+eyC!oK}Y)J|Arn^o&k7bH=q~I{aNIcZXZrx@tmBdDNWxrwn1{%AdX`Gms zNi&QcTOrs-P8qv%9$2_-!wgy0znA{bGeS^TENu84t9xdDRce+6Ve~cHk8}iZpFES;cJ5k#W`xtZqp?sNOO); z4m}0*#KT@^s{64cc_2>s6p}>D&`?z+v)fer*CVX<`aJSu6C?LpnMn~`Sqiq+>eqrg zVn`z7bkT5E2+7^Mm~K43t9@zpxOLzczDbO9wD)V>-ric@gqw$i z@~AbKZ!zDB2{Ne-TQo|DcXsw{z=+AKKJxdM49n_(u~Es#dU#o7 z6=sKVa0t*}ztOLOo@*hq#X(124ue03^&zU^=hamhb%-p3mAwSPc+IO@2-&(G;ZP;Z z2!^-=+D@SsN%fh}O{dd+#<(kMR6^(RZ&}+xt#4I4mqVyz$vbBtHEYC6;t$lJ?V;jX zrWr^^Xfh1-?L{su%pKpGrw=DHRb)Ho|I-Z{LAv2n?{Xy9f$U04sk~`j2HgTqpLo0Z zkTet;IOw3?A16SE%{_Jrx*jG*r16|;gM zIjBC7P^uW=)lPQujx{K`oXb46N>TQ2k$S6AiK;`(uL>#iwt@(rVcuO>gBE|ghW+A& zOZ|Ii(g@i)RNUbsPZO+3xW`7tVXf0E2AMDNRv5+i-HA`4X1=I=5KMFBAE671VN?$M z+)c=sRx;Wg97>@FQ+0<55O4`c5SwMl2sP97l3h?-8gf?>Lj>qHpJ!myS8a)uZV%D+ zD5LR^ZlcbFWaQ1#UG2!Z$-=lU-xGUb23t8dA(Mn9%4^>}o;2YA&VERIVGiiwWk?Mj z2}l-`=D;br{PV;-yh@R%`q)pYc!ZZB*>N{k1*H6^NI;!>dtc?y5|eg?NFG|Ni34E4 zqBA+^{g&t~mF8h^>@VMC3IY&Uiy60?m^M5}PpD3TS>9*2{f%ip~0pt^2)vuNsy;tw=G{rnl!I5 zAj}ySxWj0q|Vo~XaTHdD$cP+(DLL(Qb@35W%c};yFM^*~Zki(Z6 zIpY3Yn^LW1Rm_Zopk&S)M1`NB7}fk_QomXx;)-J?`{dj*b*Gu%3WT)unGv$u%pA!k zLLr0I4_eq+wXMsc45z@{kuwE6k#uA9ue0oaeQEC$+3~xcqENfdcGt9k|Oumaq7Uhv|Z}Zh7|7g`ysU16xYKy|s-3mrL++<32 zvo@$t1iKjPNzme$XU0&J;Q7T|N7ASaKlL~B06~F7i*OcqP>{&UH&l(bREQdGV%ES_ zHhi26`Cv}LFci!Z28D&evg~@C^|k4WAr(9`zZLX=fJ?68N*-og2WG0TlKRnE{b`$qrULzKO5xj0 zb~CQuoDeVi%(X)cWWwEC~N^oMJ5jIXeZanV0d-617_6B$t^oQ^p z)LuKw6Vw7hkRZxVI3Zq7jxyqPJp_j|R7@!PbB>O;HXI^$3UEw{)rA7^4TN624b9=O zf0HT4<5|x3z%<^MHpZRpi0lS$AuP>GAf$=li!KD`Cb)}G$vFSTQqS6?k~9OnH*Jv6 zG+k=QdFMi`a|%QTg3rEwd`|b{AsONn`2Q;(*Jx2ev2ka^>1O`hCO7Nfn?0U!5q@j- z-)i{(Ms81K=JxXchUzJix3|Cjzg1MKDR8FZ`?vhS<3QQ}M%(eX_dh(mdAxHbKKS40 zIFl*u3;ZdnqZ4?t{$H7L3ha*lQgS@=-`eq0?kM$_qP_IMld0dWIX3$%=X^Nn<7V1$VNta99Z8T8&+pq%Beb>&Rp+s*$Z zA6xvvH3RCoB>PAGKZP3gz>d8-+&nuDUjL_3fAF0guJ2{G(~&mA8E=0Bjri~K$yVTu zDF#pp{O`p7kXk=J1#W-S`2+FaK?ebfu}|-B{&&KEE7dPNs`YnM<8R6TIsE+;2>i81 z{O3Y{&AHy5EBC)*(_gFq*Vq}a!JNP1SZ4SijQwVy|KrggbLY>hUL$4yjQCfzCt#GE z?C{hi{+a2-=sz;#Bvc+?!9t%WW-a(rn%urN=^@a>5sAW`2DRv;w0}mf0GTy zKa=DNTGa)QP&^nZYH3S6EZ_xYb#4m5apWWRO-`?KsF$!Y^r!Rh>X|I^i>2VX89;X= z&FTIF5sHnYC%(@J><32ODg8*N*e$J>oc!fpIbqWZEK{9=-P!mJG1WFH>)KmPpXqf@ zJQ8Yipnwse#^jtExyPlhpLUOb9v`+JZTD5o%8y@hd4AVCYCa){#e;x8RB$DZdNdA3 zO~UiKA>!<|H~z*ssv7Ig;LbTfQkcwA#qwrWoqc~+CRS$T{3U_lL_%eG^6hf->KdZh z;S0mEco&AHc5i*dtJ=G>cd%_R3)6Ftnf^d{pcdr~BxYaW!Y2bz#Wv$JlWxZ1t$=j=DR#-P?V2XXHQ$ee`rfk^JRg z7{U1y1uZdAyZ?f`wVRl&r>guwO`5f|lBH|M~ydJt6Y3F{(jYYUc~ zw7zg_^Y&(hSR!pj6Ia~(=(q)qy=lmE=RHHTA zt0z`{mxcvuo=y^`(kRDhZFAoAb6OuVS}=jCohn(bPfq|kC|`t*+O1e;up8oBV^k9A zemLNmOW9MRP%j<#BHq>R0|lnE8dc%L~^WY zmQ%P@RE|wlm=5QYSA*F3q=ND_NCRDC)WdXkthLQ zR*bw_44oLaje$-Gv5m|VkDP0CM!VP!cXB_BDkuAf#&sB1br__PW*0ZP;D8(G2(qlK zsT_SN&HgEtNP6o)VIFoz8Fei@2dKyRrnV|}cJ+CjFEr=$G)ve5}_x7XhWWL zlR8CBogt!jet#C*}c zX?>Le!pMj2w0W>}pZhq!6?-*2p%@c&S8}(+R}irhD?vJHNR2`-*#}pM=K6EnH;_;< zKOlMQG+*fMDAQV-yl&rXXO~s`vb8qAFms|G!%bo3d!Og^(HnKB`g;FDaJ;4(NvTK2 zwu$IVN%4h&sCfgiL}$X;)WLMGYCM>s5M_q~Ep*!kYkM-fG)d#Nv zTaCj=ZQ|?~MoT&=;d%}vJpG=9L}5$Lko2}>xXSb0oW4#|qjbO5k~}7?J|}d-_YJwgicvQ!32=3 zXBgAC-T6V^5r^KT^iv?brH)r7VNqP( ztZiJi?;EwC0av^cj&1v#_(8Hg%ne!LG;9Vl9-yg7fdBG6a04p$C8r~aE>D-LCnJ7pS@GO0 zHC}~)v^IyUzAmQS}H3mwV!cX zQBEP2Udh0%UNYk%F%qHaJ|(dWGG;XBeQUt2bzRKi#$clvQ*P13Yq0D=1V~B7A9(#m?uo835b+uE# zbuz4TakQtGncVWozoo7hOG%yv$tapHfh=-Y?2l55%&acC-=v2?Itv#?+xDT2=+fE! z9J|O#;g3}aGnYl_#Hu$c06!iJ+TsF6$VY;Rz(pM2UA&*y|M`X1Q zXE>osCHl7|=e-G|)^!cg3C6@Cvc-Hv-xpMRH>nW4^uweIDlPhb%;lGky|BH4f5EmPbmYcQcH8)6vkgF@!%iHJ}01Rn>}7| zQf*vC%PYrQM;45&Gv*kan+($oa7CwS(#rFF2__}cBN*h#=3JpD_(E88eIZ-BR%oo# zq|yb|qV4}liU)>^TUWj%*P7s(CiIMLXd9m)kpHvfNgii(dl$Yi?X?^u6PoUvW~R}p zoZ!ruH*1+Zn z;@!;>F$t%FN*?kf(&6I>hd3_}zWDk0(giFf=CDeqPl6Jy*`f?2qof(pT=Q zwRDQ{R4^Ma-Y-N`w;BnMJ{2#=TqU(m&SF(xhW({4x766yue{vbP9u+u{)R6 zi-%*J1n`M4<Z0^kt z#6}vCRQm>~wh#fbXdc#+AE)QYzxI;fqwL+Y3a z)Uw>ETcsW2GMsDbWhhL$;Y_Wp_JasTdleK+#dx&N-OZ{d z;vxn5O7QPCWBOSo@aN1|L^2zMjiHN2@3d5Q&wM;Ar^wu$^JEMWv{3p8RYm7E(9!pl zu@LeCYZ0={dRV7LW8>X2c%bj)De~st;j_(=&vR)47HLt}1V?tTKVkoT+qykHq?yP20GF9HwXrRN zjtIlTE6f}g%u8}e`}Og~DZ!|h(ju60x-I*{lHjxk9SIwjCkwl1N!j8ldL~Kk_6Emd z1P-}rD%Y*a1)RjZfWTLkL78{vFTd>aJq6MnqZTzrYU$~2JYpbm$jT2NUU)RupHGf! zjl5xm!Q;BBdrbII+3N*9XYx(Vd~z&8tv{Gq^_fu2Xt+Ev zvw-wU@$CQ+9ZeibZLYW75!yLpEP}XOGWA{f@>5WY)pu zx26}yqrT(`Wv5k`8yy3bungb%ppwpuLL+g6)bn0m=x3QekK!W`6ogAr1p@WX4IhiV zPYU>Ak~upEzrFGO441wAiGY{TwGy{ep0(1n3-37uThQ#PNJ})sH5SFjyVI4|kL`PR zGkV{yidvM1GYhfV8{K#fhL~ertcI9(Wpq-Ky>BH)D@DV6FIuBcX9W^GW^(vOl>u+A z){0CmH%*mr+2LEemzPkwV^f&wq_8Sex`s?&ITPA%%s5DWniKjt>hAs}W>X#3>C$Qi z{tcc~OlN9hd>RtTQgu|^mGj-e^Nym2Ci?rUgIPh#QL+B0XKc92+(CsMVdEw09lfe= zxVZv*fe@;kj*9bHGES@lu5^{F9q;m{Pl3;phnIP>;FFtr$Y9|6r&7)e)ICo}QQ3m9 z2{onc$1Cy@>*ZOgsm=C0P`UQt!e@!1(q+xKOetMtPV>CEUFK%}Xw%V`%CVfWJ+dh= zTwy$5tg})#P*r!wU$0bII$VPlLT;9%q>h@cB>`;a_$wtr24U(_!PYzlsiTI@)C%+$ zH|;0ZXdhG*svx!4U~;wk_)}XVt<)-agn{d7RzZEFy(9Bq$=rBN1lHfQo%1Pgkk^+K zaIZ^Yn8?;ZEoiGVk)k)(4vA036D5+3J=yJQl4qoc^%c>!DJBKh5{yIg#?dwMKw+NPlz?F6+fODpXwP z#W=i%Y34dT34!O<1<;j)lh)Tyie4J0u)J`i_|+I53)q?2 zWZW2e7=m}}qCr&Q7^hT0n6h{bO%dam5=2DMX8G_FV%Ywi_Lx3Wjz_VP`wMb*lTatU zGja#7*j8EGIXjp}L$W;>S4m+YD5$^))~-!h~(9pr~Xg@^%FWZboM>lq}WeL2%47^3i+fg-8A0 z-WZWPXuImSCW}3ogC{%Lb=-T^Yhw?4F0#n-T`Oj@ zMVUlCFfjt>N%R0gG;2A58b7-ehOSPWJ8Jz-Azy+Obaa;lH3i8y58aAQR*_))m!! z5l@-4G3MQk>4&T@buK69(QCountO)}kmrkPYE$Hw#mU}kO@zR+>f{IZNUW0L&bPN2 z7PL|XbXQ+rv*Wfz^qczsSa)__zwkN6CF0Xag_IY3WKFV6cyddqP#{Ch5r1CeVT}oz zeZf|17{3=r#UU)p6SgVShpuiO96_>9zrvUi(92vLuR`~FclLi9Ypu1xEue<*EYNfA zb6XbYlu=&5hm(>hc&cM{m}Hg8J$OWN+4Ed>XA6T(3@Md<$I9ff?|^}lUNSmCwSVI7 zhuwmENn(5^&y=Eyh*?BE`^IV5BlY3{8%mxXtWt<^)Ybj~i-{XwAN$TsJwJ&!$JW>> z90?H-bJP~J(?`a7h$wJb4OHPVtlnqOqWx;a&@AxW6sj5;cQMT}(&bZ^WAZ#c?zUcn z!B$~;Vf2lB31&z9M>-k$7&GF>hUj~A()?5YGq(f2fp2b%`Mv$k#}g$FpIQt9<}oQ8 zm+c!Y^OB8xyJ0TTdMs|2S5lAxpAMB}QYP!{zNcGPv3pH#E*;L_izJJBK11;%Gt4kp zF#eNF^OI+k^iIDDikXe{-SBeY^|b?(ynobPMrV$X5gapj?%UN)IzL9{OgCGu7)wwP zhldva0-#OCo)p+?HD2<)XFN3wKP??GX}5lxa!d>bsuyl zuzp>P^=$Bo=UEW2Xdx`NigAj%>UA>0o5ZoRqy5k}FP%x{!0#)%g<%=fIzUZLYVz2gE+;%ulo1b&_95OUVKT&e<_w2cAqJGv^3 z_c%zD*a-91JGxS+za-{*S228k&I&Zfe|EFEMLRLw@%2K@&&riT3WbuBG6LKboys76 z9777582cPPdYw8Jthk!aG5rW)$McZ@!Mq{g^8H(V@2 zlT$SbhxuCxyE|d$6sE$~PrUTiYv+K{+K-4BYuyY<^4a83ru*Tn3uZf-g4~o3{VSDi zZI`6B9WY8_w-|a+zDw=C1+mbqs|1cs_E#mGs6z?zzh91Pt;*`h#lmB$`tB61o#cJt zOLzQzh|xu+=uJhIvIb5(+^3zJiEl2fz4@Adm&e`dMQeXK{LwAK4y|vm#Qn|pkGC&x zsZ|^s7EonyzZB%j&%bHFhAN@9`-&=f;dU>Z+T)z`+8z49NKTc~Yn}<`0%;*}hfr$n zyMbZyJs0xZz!0S{kKVJO05b@JzyDFzD=@;gXc6%Zj3^0#$Fg`fF_S&pD}NlvsA)VV zrsg4JD?&t~%jS)an2>lYz?2uab}0MW=jADY12aHme$hF;AJlg3TztnAx_p1aUdZiS zyeqq+MtGJlX@3UW-|;G|Z@`6`Rev{|k^Sk;d)tkP8Vk1=B0IiH zGsb`Rv!I>W1<5N%ZZ<<8xez2P{34$N$+9$$vA!I+11zTQ!@Ro6 zLe@D6Yw)QJn7qF;wjXjv6ah)WS&yjd3jD93Vywguhw-?5_Q$$y_y|=l-$(BrIXm^q zB}i^muCDG6dDcX!bbOsoj9+h*rG4+`=Ca!OwDjxr-S>V0!hW#V+u@wa99#URMb^lm zl{I^j3#74crO7pGsECastnxmUKtx5}m$~M?R$4#ccN@MH5c_`D5Gq=w6RfiB>yA5B!X(``0)5dU|Jeq z9#(EaID<1oI0FZNf0HKyD8eDya<@8*Dr;+BcLW?A)Us-XxQ-aB4%-IHM_(^DfWn?n zXY~-~T|!l#0z{ZQw%UTjMCaZ*r0&0O6;J(C5FHn8tl8Rh;%KWG*Ea7&kY$p*YNR5T z;AdZ{_+|9%4NR&~L=X=B$qT9cj&~W7Df>%*oh$DdeL4m9>x~biI>!{Ta01Ph(zN6- z&k{eP1ia+kH@zWDFczU@Lsi41F#9aX<0D}-4tIl$4tbP7|C}*hD14_jDT60R_G>!M z@q-V}Y>}*ijA;quddN<-XY3|xqUKMu9z8%}!97iGC0uBv z>_dj)kh}O5WLfyDUjsIR2ub9r1zw=L@hJT^r@L&RI+w_CfokbbtzHZ~3MZ4p@B!bL zN+6PfYJUV3LbH6ZA&0kiKZB!SU|ZA%&NC4g@Jxc_6mX7C2ugJIKdCe8QL&iRjn=Nm z$5UG+mkS^CS6be4seFoAxOL^-^!V4OPZ}SryIuQH>DsTJ$YOW1yT$*|?9Lm$p0Af` z8`G`c?j;Q=pyt~4$}B9a*BI}g0(D0RFUc@r?hY=taD0_yksf`h+<0`hi`tTehrNXd zosv)*JnrKuP!ILg*Oe$Lh!O04<-fXn{OH=(84PMwtw=eJ%mXB=E*dX;*{ufSjXg$* z;`MG@ur66OlP{8D%zVpPPaft&_8Z448VZh1g`{_lr?euyZP#TNRaH~e4r)0d zQ`@xjA{L4MPWz30UtHR+xO{&lYc41;>Em&Yoj-1dq&OXE6HAcP7{1OkM2=l&hiyFW zrtACU0^4v5Mjlq{7!}m$d_bIrZ_@aF!t~1d*Pj@94e%Dp%u;G{t$C=mqHZb0b3$ah z?Ig&oACcqe43bBg_CAAyU&~=sm6h*4l15~2`<|$uYbz$r;~Es)d1-i4-%iEOvjcpJ Kx_{$z^8W!ex7_=o)$`8G2A+C?ynzZUjVW7&;WBO<-tHx?4&C2`Ld&kOnD{kW>Ky zL9jsq1@0Nt$0y(SdB5+u_jmvQ`>lOu@3q!mYn>fy$En$y*qa3qT56hV00aUBq`?5} z%|oj+m6fga4Uem7>ZpPl007N9W9Q}##{htvyN{Qlx)RF7)C@(k3_t)DfDzyT&^C77 z9*X+2ATrzfB^2qVG-TYo9`=NVM?4&HVE06~G-SUV3d9}vfZ_~COt9t1oc#2M_I zZR|n39K?mZzygB!1c7h+4PPVRPWw0%L;(gbBSU4dZVVufa{3i+`zzee*~<--kpyLU z?cLl#`%sf_xIF>COu*gF_=08I2SN=g9o$cz08?J@#}23int(2#51;^Bz!z`<&Hz4u zFqpc79B;r7%vbsgeb#+_eNf95)N%prKn)e(EZ_#%?CS%BJ^*Dv_}RAJjuPVgEC{6% z01!Rf+xy4|03=BOuoJ(x_a%RCZ>InNU^4*F;{H?rY#sneZ-D&xpFG}c06-H80QDU| zdA4Z)a3=x)kdq!ZUN-yZfq^m9(GdVX6axU2DFDz90RXxAw{`>b2>C$aH~<)dZKX2+ z02!G8!0!aww)l&BlY$DrwA;Uw`QCne(||I-M#sR+K+DF=#C(9A4TV-Zgy!Qz8^|8R zDB(^z*jt~pG`wb~`*ix3H|D%n5)0;oTeE86{;!1S1gk0|(GNXuU&+ z^oraq-HZNX*lPo5NnwU?8W@BYfYL%>w2-|HaEL(mfzT4)0SbY^iNGx6A94T)6b9d$ z0w`e+0E&PiKqr2u|3mHn;uP}KqfJ|AmO^sj9A<_6;GhGHTso&8&Sb!!-4A-;zXuZE zq{p?KsO5xI8{cn`T4gr3SN%()P!Lt6Q`>uyV?dSc|iw*mmdxL4%7P;Hrz(tZw7 z%o|eaWEvf>GHF;o31JZbU7!Nzy8ov@wj#TqOp8y@Q_MN^I)X5t{!O6nyPidFWYbev zL{>rEo!j#_)%L}Th)_ga8ixOg%6}xgtTh3Q=<%a|C`lDHdi=ouMe56UG0^}u5=HPg zS)o*C-a;1TyARNJWyfZ?Y+dINbvaK#PrPD^>o+NrXKL zu`(!vAk%=ZK8QiL8@@Py@cpp3^f$EqOfkbjo%@22WouawY0kCkP3s%)PDA~BbrRL& zv0=Sp_`W2`$pt*P-i;vsy&eGjzDprahuruZ;sg=c=>5U)Zq@}nfsjMj#0r3`yLq>N z+O^{{1Qr39b+G&CpGF4ZC3JW~j-aQMhA9>x+IatI_=4=#jgQ~OFQ)dR+JkZ5sXs{! z9-q%6upy6~hhrTO-dI31ARs4mZoDrVPvDPWfe{_TtOe5`kbeR$W$1mbz6Cl-=f_U% zRh>;f`x}_hO4ibfoJ}_llpvzV?#lt>ynqWHL`S}nplK{Hj3p2ZI7zziOu>stXNl|r zo%}w%Mz0}|39%={AP{XNl1qn_AL4fHN6))>IvuRK5RKi>0c0y+x#(P zt~uy>-wX?zYs3SVf8K1e6^Xt_Bll0>vYeK4k*5 z^A!vu?R5uP8~}ZV-IxD2k~2+S$%s?-*6r-92oZPvx`mAY5{<|@t`^c z`_qQYK1yLK*{+MJO(bM$ho`%!>tT^C%rB)IT z^WV6E2Zadmy?>~0%EEMn(mzaqEE3iBDoF;L1<}ja({GD3#6c7sU?9j=(D_QIDuVk)t4n+_?@@$Oc@H0| zRMt7nfO(mBKTO4?+Ca*nEUK8}o=r;4E3f7Kc6-iz1DV6%6?&tG=P>L`rqt9F2cquy-fQx}%`;XS|j@l};%m!i}Q@!xI#vUmxtdp2ss96ZQh$@^g= zM|?$iabZRBTZ4bAXpuXM!3pdSweKEMONAC;rPd&D*J=!~ZE@n@G-Baj2hP=A;9M|eAcW~V~(otWBB#eMhCh>KO71iPR;~# zz;*cbBueZ)N{B4QKzDMS@653DELhBJWJpknQLI+$Vuci)R52R*ZmI`&VC&*KSm zFgX_D(*aO)7dpHg83gCb!R+-kp|Qk;%-+TFQJdkzmO7FxHmuZ*9@F6BX-Kek5JiZ; z!8d0nDkR77mx`(6fy}iAzc8CHHDjJcfMWH<>!J_7A9a_&(Kh&9158*gu>|6eHH1uh zuo^_b37H1rcmR%vZp&;ZzFS@F!U7aBEd>5Pu$tZmy&Ak)#qN{)(f6hvgO9b?{^Wuf z8VgWa=8zJ2FcHsq;-LM3{l`iG1}JFHzLX-K2}?i-K=CLby9oy(r};)xi!aOgd?0Ya z{xkTN5@P7XJVFAiE^}zf{D30hW-FsB(9=B#fMWbwv16m}hZp;7(PP_Q8?P>%TkJ#{ zdgL5C5-n+(7P?w2IDD=>?fAX~05Bp52KE6`temrtu;R!iI|vwbSrQ3WPqa3!ru_Z- z#{sZqLFUKlVo?(SkP^cJYMb6Giv%Xfp2rfBeGn>)`G)vNT|n()l5c8Em#_fPH=9VS;9*L?_1smeD#{8bCtEf9b9CYMT%%NM)|O0ebwdw@JB5sn9r zKJ}e{4NCth5DBw?D>qCR-2Va0-=0* z!J4rz|B2uqSdihvyuA%q8Zy;FH1fc^lGr~;`~_pJyi9~Ojn?v`m-HLozSw7##<4Gt zVZepb=r0uhz=jNAp;7x>2kaj*|AN6$vuJjPtSqvuR}z$fx&B>6A`Z{a8Zb^zr$V1aKnoBnJ%anEsbAi31i#ze@*`mr_M|e!Tyd1UaeJJNVa+T zNB%E@kns~E&mTQXvlf-dgR{lWjl<$qi4VhEIzoRD0SsgKe%k~;vj`ZQRmH~_IbMT! z03faaC?!WUe=Y83epnj3)&Cd3>eGiMWYL~*AHWk37Vqf&lz_XOF6Jeqe+n1H_bEwX_I7{;rM19m zL!Vw(H~v0J*(JY@0|A-u&TTwb(0Jl6`(pS7HT^9$zg{P1=Ds*JbZoBsrJrlDSx{)+ z?`{5|Io`_`CjqvLXB@zwmIj|V;C}brrwwZbebyf2-4Oi(qXO9r7vBD|ErqOFIUp|# z{ZRjX3i;*%4z}M`J{68{xN4AW19Wl;TZhHG9Co z#!7|9k#-3fMk3sik;ZDNxivMcq9ML1dgIZl%i*}B@nk&93D|j-b_ud}3G$f2ODEkK z^Dge3;{evf#8fjIPURhl5A9@9n&FP))78$_FxTUKH2TO+E~fO;b@S}})s2}Q-sMU- zad143G%APLD{PtOdQ9%K#XVrgg`8a}`2I2IRqnLxc72G!ojijS{m-Mfs!B^QlAs)& z8^hMT(2n?W9F6FGOSw4~I|L`*RD_6(!(*<=s^invd3^3mxXrOVU)*Pv#^0 z9;K{9HP;~ArkexJ5T4u9Kw`4AcLb*7@S4pHR>u5>khzxbbXmXj-1b`@L>XpA6^HaZ z84qa<*Hy@2U8&kBCg$0Cmjbd|*mWr;B<(JMS|p0z%gjB|)n5 z1-Js2jwH#Y%Q$1`KrhQ*}w+e-2CkV0^2LJ-Vl#aPW=3 zXZ2)d@|2GGZ4jT~(yp7AB-XJk}zWguftL^>flU2^Y~ zdP|2pIy%-$B{V-j$ve5G8mTFeaOZ-%^7yl+zz)n@?|MVte4&p+R*2f;YW-=v;we|R zet(mo2IevAwdtKKf0AIExO?w+T~sTxjmD}+a`|W1n?rPDAU7;hRugVr{bcdLzt#Q~ zf0dXuzQap_v-*~PuwfXNQgu@eUhQOS8694?Qy)H~Uwg)WB80s1JZ0L*{U+DXKF;%5 zNt+)J{;DT__Q`KCWBDfW=+dYlO$JByP9_HyHCvpa1M=`A+a~2I$OPqp{prI6Yl?oT zYE1Rnc;|3#$MGyH#}6A0qT0j`7T3Bnj4`L#oP?+n)ElftJl^>=#)qYZ+X;nv!mIm_ zi#wVn7BMr&XDdPuY?z1nEQp@e)^DU{U=?WR4t@RL01ibr|B*%TWL5vgAao1 zoI9DYU<)obmLKz99d&m}s1%GI7ah@N^QZz9Y?2+=$Ti;>_f;$FjKv)zrR%0WesdJ- zqK{{vzEtV((CV&7wRArz5Xgk~HGlPnErPDc~ z&ezPx(e*Gs2*Q{yA$W_QZkpOwuZ%gxq3pCm`=)>L|GK@!v-=Tv{l`1-+>u{63uZlA4+W6#HH-!DO& z7<*ISGdBo+3H$J}w1f)qm)Ra2u|DUub!hx6_7-&j)#I;6gj1#s4{~xp%bD(Zh7Gx! z%(5!nxDzMEKipz%WO4)AeR^{9qfk^rs-ub$p<}jERvnwA%C;ISlwExbG&lKo(nRMM zzgpjUzl0{LCfc+UV7Qd>;iW(-32@hj93t&aqa9>9ptW%8q+)PT7-e9GC+RDwyDQ5n zg;3e{mrWz(+>LucocJrJQZJh$Pes#YblHZaC>{fxp zikmpq>ab(j9^Y*Q@F%!xVYTJf6?iN zepB$L^WhebeG9Bykuq5#I{p0v5!{DPnC3mp`W$ey>n)-6UeOQH>m5jUX|T@pzx7JQbl3mZ0R2qz8MhGToISx z5$XefZD&&z%z{$LTa@4}R)=g$cOEV_fNM(A#m~jv=}%v6d4GDvYgQgOQ7k--{3xoK zkm``(Xz!4&`z7TS^GJNtrIC?+sn*g!roaf+<2u7Gl9{^viQiU-{Uzdiq|2YASv2e- zq;#PIbYc0XhTIDylTnp(7gF+`(5fAACY)=$_0@x$2pVIVqnX7UO2%dJOm-8Z1KSTv zabL+ZJp&&^M^Y8OxzM#TdFNtNU|6X|&b>ab1NRpfLaaW$CQSyXGJ}5^83E62bKP!! z5)wUkXhzr~eoTBM_iDl{ON#{F2^fTA!=#BlD1SrBPaba!?B2<3Y3X~i(Ptg(d`V&9 ze4s*HCySa9xqCE4A^Fif(fQ~?u^`>YK|VI>^`OsvkvChV<5OXcy@@(;2rJkeNYL;V za*9ud3$F|~Dn$`1Tob%}b}T&=F1j*+b7g^Y_Dz*}RA%p_l7Cgr{!Pdzniu*Ro_nYd z;rSU+enuC}1I#nq$JfvbgI3Bxqf*1`e@sfyMvw~{*O`A3X%Eh$Pfv-Z_ohEu zWr;40?y?h0?{}170TG(%()3rT8gnIa@qTkVuNYH;gZ+rQK77Glad~7kr2F8>)E(Uh zq)p#h(fWx@KUQ7-_?-u5ALZ_HdQN}bveTmG?hza}5O=L*$rqyO+w|`~`)E?h76oY0 z)1q~ZlpvoJB4%n_l5{fdNBA=&AKuUv{}rLK2fV#+K531zD6oP1zx+UcTbWYLE1bgQ z3jNvMI#oEk*3LA~1#lz41CHP!TYfc|z8HPv@E)*vTYWQ@rLbN_&R+4(EBn%j!j;pD zEB$z`lK|d@R+rdfEuPDdMh2hEzTD)wB&M2do5+)msjOPk+u5ivy3PM+ZRIy&6VyEMgOsoHvq3OfVf70*HNB|7ke2TDY=f4M`r;sI!(TrfI%F%JWr zI6{#dgGJfk^Q!kRcVG~R0%Z5AD(_mR#w`77(wk--CtHX$YO#`&kM zn0;0R5q9`P(UqJp3Auo6OCxqg~$(Gxn8bn0oY%agz0AXkF`K+4(su$hkRs~$?#?t^X8c8?6>H0 z$Wou8wCuNK@9Z}fqqbcVu|q5!d!WZ6*j9#jjTaj7w(NNCK@yE}a20pLJ1u@{o^+$B ze_L-ZKYinvOmj91vmVXyD@gi#loU^c#;%Gr4a>DPWlLnf5r}+8?CQ$wtuK%{Q zafQ1IFOr#pUf+wD`_MJraQb@_1ze_ov#CMS``o^v>uH;qilubjo2(spO`p(@awopOSNYmN3XNYvg{m{4|7z$qEr zsX{1|OiG*=(bK5AeFw-Gza=)-*$JgJnWef|GO;Ohpw~Bc{gI2HSgY8mqOjjuAn)Q) zy%O=U186xZ^hAwDYUyr*yl}?jB+BJMeCi&+G~LW4aZJhe#UwUkoz)9_6hU)p!IZZ~ zQ~e>6qQp%BBQvwa^QEa>FfpNYug9`uLYKnPFSdrA^SSIs;-){_zic}UkH!qtH} zY^Pxtxg#dGZM(p25vt9_x~|FlPLAGL5aa8u_r9lEU{jk+RXa9J+$@rVem>c4Vz#Sh z7J+19_3hb3V@xhb+s9HG&5AN*MUOV9djrdj%SJYv;_;b_(t(_e=qDtSrV502X z;%<^Tmb^+Cu0$c*E`C*8w)@?=Nj3qe_i9rV!RoDAUJ_x%MKsv4lWeX@L^;+E>E#Nh zZogMVKM$JU)IM%uVPUddTX1;I2Z!lKASuPVj@outh-lU)_EN6v4K9QIIc>$;&)vy{ zu2$rG2)~`K7by-ta?fjIFiAFpB?xZTV|F#`IMrQy(Ju;AZqpWPsnrgO2ys`<&$q$7 zRI28Y)Lb3Xp;2Jxb=8h#oTk>((=%%mF6SN|eFPopa@VX)6fR6^G7UmcUp0v>IPAR^ z;}DKiIz$A4;d!EcBA7v7LSb#VO?910g1@_?3}v`7SA37XILmj0$Ev3JS#XY$+qRc{ z@E5-W$A)tSALxhPp1xC0V7t!y6IDc}4bWt6-TK2(aW>7=|G|M3L_77-?sF^8%bTCa zd5BX8PRjAt43^5Clh4@>O+3%>V1ifLv~7^dqc$vCXwHe^*TiZm+Xm@V^z;PGnC85| zy<@(q<*$Ncrgo?jl{>za+*R$AnDzs0Og_1axn!|xo4!r;Dk_*sst0vc(h8Nr z_vptH#*2b_M#ZK1rE~8#BnxbG-ccKT8FE5me9CvHex31o`K|ZIT6n8v-=8J%gTd_K zz@?Pu`m;VY{c5;Cy6ed&+@mD0(vivzC!<|2w+(PqdCDzN(#K22)=4gObmg+ z;NKpe#kGP zDZ?=7xjJgVifiuU_Om{7m#1)&W$lSeeIGYxsW`)cIGv$%QorRRiTn$ERPK{`L#hkA zdP}u>%L^Q#2Uw>yi@l?+(FP(aOWxfPQZ6O0Pce)vS z`9kwvEy=fP=GG^4(fr+t8_ddF6??#o$wAdS4BQm?CJv89G_^Wfa(9xskGYh1HyG2U z7=GzpiQ*V(l;`cFkYN!tQEUAL`Fp&HSHA%F`Wyr^CO*7q{vw$CaKf_5{6N=Xb@GUaY5lvQ);h=9bI`HP zR}9uz=44qN4hXlO32TY7i$W%RJLGw7)qZ~%4>1R{O}liTgS|E7KcXa|`a*inMWublJ>yzSd0MxqHzIq0+nur8xi|J1EN5b( z-h4jt$Rp>bueUELCln`j2YMQUNlFsh47eSKiv`Z2haGB_iG8}430oY$zPc_m)iyP$GqE2Wpm z_UjFS$jEAoyr_>1M|&4(s{^d%=vzMs>;bAbjV|6#yK8Y$F8W>T^*73UfC-=fx?9a` zg;q8vcc{GqMLxpZdQJU~h2^m;w3LzC9UV#6a0`hh4-Rs@wM%$lx1d8`b4G8ns?=LF zRP1_vmwNUA59l2wXnuqx)t`vJpY-{Z%Iu4!k7g$hvrZLHU;8VotrKc(fpQzn^ zc(A)HM_k8@)Y@n}=Il|G)Z*bSibmax^OqGGmg3!+ z=7h?vce-+y(z0{JC7%ho1f5T?=@N#z_Iez1Zp2l{)R3d0;y@eekgrebtChm7l`?NEaY3H-CiS>r!th}odzaTA z^5w1y}xkD;3Ik~ z`Eu{yXFR&b;$|tj-|Zs;UF&kY4uLw8FYKvlt?Ez16n^{DeU)&;M!2Os1uLXEAn68ZE3FkusIQv z@s2qVD{>Frdn_5POUr&_#DPVPfv~k-_O}lu{iegOQ|B|>r2@oQGOa_k+o_Vs?}Z)g%5prU z{=jnQ$hWhq@qj0d*7*B}b>hasV2VB9Mt{AzJ+1AT;}zL&B$N6amZPLp)!}i*!Z}_% z!A+Lec;wYCM{luwkXUf)d6e+yr7u@{HqMj>C_5R~wu^NH zROTyFU~2#Ds0llUYYKV2%J(i&Vf5ULYva?L;|#lr)3MJ_Dn;Jilz&#+ zv6X&Jf_};Na{uv+sE=aujspF^XE|7Z{(L;A-g;a@M*jq}YNe}r{OfIPu2-&V^Ccf7 zZ{Fy8E2R{*!nW&eZvftc4!aO#%@eLP^4YeS7iHM(UB|z#$TW1(UPmpHvm{#73Up_n3so*y?wPAQUctu2ml&@A2c=wF1{3 zuV?M!QKelA8x-{rdE` zyVnBx#UsDKCmR&GFyT6tBQha^m;!Pgd^TK+T2`M4`Gh<=X`A*$3Hd9nU}<^|J2WGw zYiK8ebtbS!YZi%3$ECwwWn(F~)Sn1YJBUpka+{MkLP`wn0rvFz+p+*ve6}lT8+{~+ zB0L^IE!)LMa*(FjDCtWh5o*XVe2W%6%zR9Vp^JV?<%w=@id0D(skWd2by9;Lb(xuN z?a>l#p;c0-54nD72qh^|gEEUdHQ<=p0DQ^Aei1}iqOk|!fFcAfh ze8q)?>dYg8=%u65*-LoYHM59G?4b~{wUbybbQ>-*yb+kPHOU#kc0e^k1HBLMV{D?x zEJ#sWY#cnu$y0DZ(*<+InYfl%2|iji!9mp$MU>Y|+JZIX%VLXmDHjk@tgON#W<6qT z4fXPZe3`2SkW@&jSJx;r7(TJ_!iBav*h$AXERf8~GYJX_qHrRC4kpXCphC`& zWPmKvb>$>d+nzU}Ipgu)nZIybP_W()*4alGX3&^t_@yh287RvjA7jeMiztjq>u_ww8 zsRws?NEM+VHAd3XHm&w!%N7t(ez`nGmSNP;c)GSi6@X>D7aMn%WtllYTRR+SuWFlp z>KM6=and8dJ-}AWX*G5yfGpriF7k^igGgMR0V)MjZ*x@dOyEN6I~$f=K)&T zo@+yFBO0$aKf{ub9@7$B+1BK8pXIfcZEMI1M@+tL4IaW>;;%BMmN-GF^O+o9B?aKc z&Sqo{-)OWuNS6qmjl91@5)&9# zqM*jRn}_HR9%v3hbDK8Ca{g& zEenF3Rh^(e{gw2nmMj*TBIpk}efHSf-kFQ~`jb9iPo85*-v&S2-%(`fmo#z<&qqOq zx+Y@p(gf(kSJ`aEIVj=U*tk0@?(Pf#F>amkwSc%Hp0%(ixDZ-paS-QnS(iZ}2%>Lb z=FE*(hchvWNWX~vc3iILzD^VjbRPkT5~MoY3}NKc{V=uYK^%gDL1mYo7$8#@CEa4b z>JBrJYT#4TP@4@$XlZe`NJQbVL#!%Ls(kI4STdj17Ds+{hqOAZh@A(j>$Y0oxg%7Z z+E66dHL)693DS4n(dwIQidtP9yBanfBQadhFuTW3!`YEsuV)PUQPorjUQEajiE*7h z;<)xStJV)NX)d31cc071$hhNyfI`y!O&hmSA4p|5J2TSLxxM||+Z|=rRU&~EvUvaa zD#i=teXTbR(NeSwVF4vr0^m{R4EUl^Sj1yj`mj`F2jqn)y@gqVvtC_Sq({cfQ0GaU zuF+%%#P}*6Ns6?!6AK+1m?gbvV6y!#9!&dw5=qLKaZpvN6bWHt@9 zQGQMuQFwbV>#u1jMxU3{ki*x5lRQ{-sQS^g(bxzGex93xCK4H?Hkqo<6A?{>)n)m5C_~;8w#LmvsOBXvzNU?X3K}E>%F`+O^ zunNOk6lJBEmc=<-)F{_ku3D^H%mFqH5OotGEY5{pgBJqO(6-ndG7W3t?dVhe z6o0!as;!!cl7jWoc^u-SG>4Kfl5$2VWEj&g-C-kh9znSD>Hg?e{Jvbg$!^M6eCTmm=>V}wg|1^fIa@3%e~3&t#_R05*HweY z+9Ulvh#T3eL4Z_)|KMkCGdEYe7AmQJ7+Dq7$+nWS@&XsoV0k^Ztrl3YxaXfF% zEl#C@vC8-xz>_2Td@aMxL);-M3|KVK8bS}L^Gd8`jSqdul0#!!9S#xVx!l65ipQ2P zY7Ms<1#mkVv`OL7O3U5040&w~HLey>QvMM9;}&0YG2JVR#&9D^Qm_=9smDj5x);kW zx5%+y2DH1V-}vNOs$yp8NjnlL&c{=oi>7VYe}k5kzfMm^{Sx%KykNz_5o33J317cB z`apfFnvG`rVIn7I5qbURBb?q%jt^HFgF8+)J8B5gW7Pod+owftZU|ZK+Au4jj9z;K z(cTT>hmQ89YfyIhS;gKM9LT4IuovoMF~|KB74sno^8NCnO_|`O-6EPP}~MND}%XGc6B}yvBj_cya^!lL#bTl zNhgkCedfS-x3*kcOsGG`%!aMxC>OTw;2sdkO-!?(n8*A?_)DAp8wuY_SSFzE0W9;O zLOz^dA`p9uizjLQ2CoT6NJ&a9oR0M6E6QbgJejlIdv!a`sLygUDhT%G8wf_Rm{k#W zOk+5COp+da;+UQ&Rze7)RFX{eh1-ubI)~e~!H4$M1}@b7Qa0$|y_;-e#}$;*6iLz# zS=!_#-XO)q)TcdRV9$ucyB6#L&bEVzU0hcg(4UVG370u?A3H8_5#~VpP=8fyUiokU z2?fHeN>!0vFRQJ)X)Cl2)9tLtUJ;*y53dSEl59Spe{=470?!iW8n27)67v)+T?nn1 zBwx(D`vjaY;lb+1Z$YQJ+{Fuz+;@_a^h~m7rAtp?hZPEu=2n5rJ5tI1(GVktTEkeK zFY8iFVaansJ=GHS039L-H;fELD~7@=Z2GnQ&aE;J)T7|5w%KQGL+c5tJOZhMX9TCl|-xqou>vL!XZQ>H&wBZ(-rMH z*Xe?i!0*LOj9i**#!9l05MH4+IxgDh*Swo}u|1sY-FC^`Og2icUrA41BzjeSZqqwM z@(2xbB#61uuS*^KZT(_5U0g8=aB2P@gRxmA2a^XV)dt0u|t@JIw5PiY7y-j$S; zi?u@uAZ60w(Xb*5O*9qSRR-wS;i}L;i8tpOUe+N;3wb@RMB-v_-d{=#Q`Jj5mxXmC zApwdZ43Ihj)wFe#XASJ~bN^yq2FyX8VD`3h{z{Yl(GHpHMzdR_hESo@<4dfRD+pHB zk7Q1SDU}6?#R&+HFMH4H6h`~Slc~#k%DN_e3XV^P|y?a z!El+fdFf1GmN@EUU$8!;L}x1WPPj5Y%*dXb5v@WtqHBMY^dV=B)a~oL>N9Vx<&C%P zx~`03L=yD3QS39V%wU1Z!T(Nbn5|=P!L76SmA8|Ma|zYmz1Tgo^y(8{$W76+#$cQ7 zqKQdp9~H0boH+7LC`x`Zlxr4|U|U6MLHp2SdHm#td^NeEm8-{uNp!}5t(7iwPg_KZJY{1D)$`%E-M3W4W7+?c(~DU?`z;9Xg|i5I=+Y;V`o2R9O3L;{Epkk zCT7tkysn@w(O9B05_E-5-r3g>NHHA%zddXc8n1|IhoBtTkT7nHp$;z@K-C6dX_e_6 zB_@>MD6ZniLlq_XR0TrcT(0qV7x}vE%$kWKF>6s;CZ2BNgDg72Xgj3v!K$ce5x7e= zj4P}7e(mcwk9E(%Y2zQDCLd!exv!o8DM_A` zKSL8VJXqOG>xmmN#6jNH18=I5hrLQ7VZjf(GPzEMx1#H814NE*ktUCrV5`1RVn*59 zOr1W;zq}ODC-7wc?S#}6R5LjGcCB2m#_54>xTbGPwMcF9eH;@x``fUm%M1rh3@8DA z9Hh2ihwC#XUy{CnSeOc`;WUpW?n(d3+pRFH2`e6pywg80&@fMka%Jp zsK(28#JEH9#Uk(PGx3^0zkKz2`>+kcQJRQfV0_KPrB8inql63MXBADPi}%~UH zl7_PRm4k_nZ$G@z4Ep+RJ(NpPVR_(l==1Zs|GmibCf6+$R4p|^gGu!wt=dTjmR)RY zg#MDjBk#M2`PPyNH2Kkz`n+-zoi(SgzgCt_#s0S(g4bxkDl_@7+>T zoHq-_x-i5;!)(Ra$!KVIqe#>SBP+DWW(3U(i}=L?olS_F9c_Eu$TdpF)Go`_Mcpdc za3XganxZ4Klr|y0FLS>lUz3serbOS!!dE6=7iKQpb)rbCWm01?67qxO9?j9}25xfP z0PUp&tq|Vm3OF_(3ef0Be8FO&ZhWoOq>{Fe@}>HzRF>z-Pn1Q%OWK*h+apC+HE{7J z{?GVuPUT8)Ji=MIGMpDi`K49=D)v%`VWe*mxrv`*gT5H?LvQ0P8<;U^5xR{Q9A!j@ zy&Vpp_;xq})xyb>y8DNc$Lrm22Z|t8nnG?MLH%xv8T4VqfS{*%K&OuuX`~YAU~XJ` zc+QaZ9#Gi`UdQW=3<|itq_6uJjt^sZ8WeCL;89Z-I$j@L>O9cwdFi-xQ*pM{$e^gp zOXj+dSEnv?zCJqtDfb`AXn)9kd*}3o{9_?vmbmSZDun8_9UbtGV%QLF`EYXF)o1Wi z!OjRq#WMYPB3Xvh-kDYpwyZ1oRSiC+Cf<6G%oVEY|1}?}e0@u)M-n>g%HgpK=W@9Y;46CtHp5in{zW8Fa+K8y|L3lJQP1 z%Eya%gOJPTN!5Ufh^V1=bo0>q$QNx;sFSm8M}5rsD3hQk5Do$5HlL%vi}+)&)u&(0 zI?WMA@-=#T&`gVs2>whlT*iJt6nleOSbFw$4x6Pl7NCQ%IpdbfKg)N&9<>fCxcqhA z`{SzYuD>mq04l86U(>U{Zg;$V`Na2IBA_5&Eg#@1v$YZR=ux>|z`h{;wQDBd#lZZk zP60*h*JCshbs{S9wg6wo<-|PK9R9gr3g8KykA4$8m)>Kb{RriZ#Lt8+Nulu5Fbs9E zB`RL7->5uh);;IK_V4R&aOJ?vg)?jM!FDm~t*%MS#1& zh%X?{wfmUnQ)FPB@=gKg>tAt)@Qz1AanOVWx~Q zslHUqgK?D_xPZS+r{xnydDRAcuF<^BmGwc@J7R+slJRZp#z5;?tW0PI&=F=ZWdrzx zwjxNy@+eJ8ucRnZD*ESRvBo^_cE{f&zE1w@z{TxeyazP*gz(=DfQPG(h6kmSVkJoR zeSR^<3+ ze|MnG&b4C>Q;j};221zsDm{5ahu7_X0bV_&P=2WrT3A_D=6!X=8`ism=+n!JEaZS5 zF&Am!1~Dbw$_AIy9>5S&MkN;%OWuQ^ZRJ6+(W-dWH`oYK9K>8d;S!LsgIMRjbCwEL z01HzgD{#5c!a!!gH0(Oo`7TAG&JzmYVN>uRY!JOh3=}D+FF+-kaHfsxJURQ#Vr~y+ zED_WpOlb2c(M8U_uh5*>x8RA6&ps zJ&A_qsx{zSOqe)65<_OxKcJ$5NLz?F9M6jZd9;o_^kERXypW9s#bZ3m4#TiAD=tcE z^%Z-53GtXAyMlP!IeUJMHf-WS_I6pVB(!EyD3x8SDZt3mAH-14$tx7Dl=^H&x zte;Y7fwYpm!rBKRPd8>hAkPvpLIuZ-Qnqs5c^qJN%mB}eOx6v?6q4q`)-4oHM3QhR z!%wqU_8&JX;x)HmJ@Gt@w5kQR+oxDUB(9rzzO_H=9hXl1Cl5PBl67Fa>-Nq2GB)jN zg;$h?D39@zbL*ucD4F2tX4_`oP}>3RB5cu=7(hplr*?HHAEVY4ZoYf$)S+j5D>Fjk zN1q4Mt#t=t$` zS!mb8*s&Lz&KoA~iXBue&Mi)n*GuM@urJmvUq(MWKk)A&-t4sXZ?Aj*^4_=DwNt$D z9mlN5F7BRS+4&056ifd~p>SS_83Dl@f4jBWf^99WF8re8F#h>nTvIAj&~Bboxz7zX zO>os}d=5VA+5e+Ufba$qICuO{_$OLm69M5y!owlDsCWqTKVgty<2|M&rw9Lx$#0D0 z?el-iXaxfu8OD&vUI`5k`KN6DkDdRQT40mH=ja8=2md>&Jg-L-bV2EVhh>7z&tJej z3HbZ}TG++{e;EER1OJ&?%rd0yTiRuS34&e9^Uqjq1s{6qelxXc2;tuYc0k+z{je)N zWHbGHGrJ1E=ltJF<5AW>iuMV5oPb9CBh3Q7BuEkX!*X9JXmf|*2l?Miw6cUgHsfDY;8WKh;VUW_H1Py{Z}>-;cH^CPtDpXl z`gM2whxQ&YWh(HKAYd@4IC}q|Zhp%qP~ep)A?*G!=lS=nZ#lo|K>~}E=l+C!q9!l+ z$l=%FU6Dpy{EQs$tzR=Y+cSQWig*IPp-hMur(Nu8+-{_n9UgJ}DX|Ci{jc`k1FWfK zYZ%@M0YWti2muii2vtNvZ$bhQLY1nZsG(PtE>=2(-m4%*Ktw>Ah>Fqz(xi)kjgBZN zh$2ey4|-5fx%a;Jp8NgJ_dU@3_~Z zqc-`JLvQBOcCuskW$xnX$ z+Ejd7_b=s+)21ps`EE)e05!3OZwM<7fc_MDxw`!~_+Lx9`EncnE3kHwx*hi`;HgH< z$(-uipJLZrYzJ)@>pLvpPZYfndMa?uR=}DM_i0SP+R4rP>{tD^W1M3CUW8u?w*BfK z+w;qv>?MJSKGd+#4{~fm5PvG+CJ}&~_#>LhZ)w-iN`3yGdDIW;O&I@~Ae(mnpl<-1 z?BJ92Ux7W;-{uq$XZiknYA3eQkAeP7i%q%jiBb30f&r=RZg&wJ2cY0dS61k2vWeox>K?mfZH2*zG^a`GenIfl7;OzZK|?@3&@-x-XrI z{JZ%pT5P}Dw*9spzuFDdPb4&t=k~(+)*5P~)15jdRAt=7> z2;c3W1?K$u;@!qClAya4{=LiDa;+yMX*ciDfHx!;Z7{wl)14qK$P(EC|0624V{e+~7|V$9_Y{BET8 zGw#cu&cEwgp3DEVQ1jI3@8bC*{AYRv+lP7Dn6N*-_`Cj%)0Ho`YW!dF@$Vp?;l^iD z+f3@#`v0!k=%J`?4R`*~6#xB1HZ7=QB223?zjClr``cYAyA|DS;Wa~P~Z^TGdm z-P}%c)m8Pk5%YG)|JwgAQD9?pZR2;tyWeMi755)^77OG1OP|;OgSLCTn!0xMKQWt& z{!l>u;6DQ0?ED7_{v&|xaOy|#e{B}2`=b97v#RzTYSlMTmO~ z3F80Yqq5MyO^@$NpTRilPyqmb%lLLasWX;ercOUY|GBI4)TJHNoh6F^)}^xdF9`UC z`u5*7C*L@Q?LA6iy;Zgh(EJ&A{nlVmAl^=_n$J5uvW_9`Smpg&gau`5b)H79*z5-_tUUsn6 zR_m3+;w`GksH-0U*jNEPcGK5m?ld%v#7L_|c%!s0KdGSC>*cke%vlvauXC`Ohq^OO zEVWUg6;YOqciVere&Lx_Ty|{G?bkAibtA3$v+fgCn@>zk zu0lwCIIIBUKZB_*9G5uvnX)FGIU5L9jVM2wBwASM>ybXun{K(S_+S~eTD3&!>MA?^D!15unMURJ@kr`O(QQ=bIL7W_y{jkxyy!rsq%s;7)6rQ=P~w!Ss=S5WmB7LdVjCTC4R%+^WT|-y zZ5o1|M=e+}?H6cQ;e8X8r`3u802O}CmBvK?G>%Y}8q09?N=pPJgj>O=RVxT3dzS(q zGmSzvFOhV0uGlzMW;YqN7BSL$S3xV=^BJwEkLPZ32{(@H^K4eJ+gF9>^R(zGBT*{9 zW~uzD91-U*P7MwYE`XEcsHJ5(wMWA2?NI?@{9D=@MaK2x?+rW7EyOf0ImsnSg_R9Y z9c;YB4Yf(~}Re<(I0+ zybMszn{%+^5Oi+i7&Q-`Y*$!3uDPW!n)BwM8+8Qu);|(1%A5n(8EwOdypBgHUpo`w zD6zZg{pZ@_C*+wrXU5N7c(!lf<&f!Rx4H+XI8z_}=~b9hjN#i)$GKhgW8P7DU8RI&re^=F>t@aY%tPyyLLzJa*hFNit_RSf-s;jL%pN6EOpJr zxQ@%g4{m23d@Jt_O1ptQGaTw1Fv1 zJGZiSo1&=&st;5kKb0J*FWW}+z`+3L^5BRPU1gGMRK6gfM0aocYC+dT*Q{zl+2>sJ z@2^cYan3Ku0?~`WW}gxaHM3v8TRF9W@J!?LLe$~B>!+-kMJfg^EhDx*Ie)*w%trL6 zZ;cVSNU`OPREv-IXnibiDEqQM4HC-}AkD^2BJ!+$+GQX>3r}8f?KZCLMrrN#xjFfe z)9!rg>uG@gVd#L%@v{baW$Pv3+f5?=y8B+(%5@`v8QZVGQB6f!$6aksufCP%BKJg> zl5|FRph+Y@0KLjDP=ts3%OGT6P;sK9;%$YuVu;^eNU&xq_oSsuw0oIsYweRC&T!%5 zC#hc}#pH}%Vk@&u*z^LZ?`ierCohf;^YSk)5s&%TH9 zR7qGP1e5@C^IJThp^`xDN(n`Sbn)zZ)a2CBy(w>IbGtM|40jy22)?vuAx^2m($778 ze)faq3fCfunPuKtV=fmx4$W-bJd|2lpSMmxgiFGXH+U|cIN;lG;#r;R`0R{yc8DO< zF1`L0i($!;6UP=F7N}iq$r+xJ{G5nPCqt;GxcwrM8>QXul5n2>X$$s>{8l=C_8rPd zjSk+S8YB219Yh=Re(Kz$MF|hi;4-`P``BW82WD4(dwVOz^h9@ed*9(i>5m54@DHq$ z4TC&!;%bcR{@n7A-6|rCk}X+*I6mM@T{xHFj-?pXPAz zSt4_me>jIQj7|;S-Jxlmnnk2OKgS0MU?tZT)cJF;Z2Epr?91fY>2E&aH37o_)-p`Y zB2*zlH33~0soR9B>r9XsG7&a`v`Y;hKz^C*z`5|BvXY0;k?;e{by}V~(hNvEtCdES zBf}s(7)2JzgA-7+9|Ed5ELjCN5>xLGNY8^-7i@odF2dlbV$ zqCbeJuwWxI3QOvZRQo$hYFq9rQ7OC%qpx2eMY8IJzuTv=^u0!m%x|76D3+sd^3dTf zs)ewzWaW?|0ywPEV9hw#E)#G!nN5R>nR9^G2m4n+0?&34=0?Hf-6i>M!TEeMTC-RQ<~p%k?( zO9~DSqnsrM@{8*+2XNm)M!i{msMyWt0+3F_L+OOdgpj<(0Xj3BfXz-{X_iCv1!*Zu z6+-)||7@d!_UkDM3E~2g%dsNh#$+K9ux}aS7o~m_y-zxGR^dXEu%usd!8m%kG`YY@Goa7$|2LfSef#Xxv0Uvjl&ZlvS3L{TwTL-Q*Z14O-+3!>%UQ^BL)! zkm42sGd0o3kLv6Vbw=|t<9AROdpZX4$@$LF^t_sI?`zew*7AWv3HLSc9uVPu4be@o z1)NVTumhej7>{!52lDAi!;2;0&pX75wNz>=SeJ~_)pP**@I@}V73zlH3Y%+e%y1z3ajO{rWvVXgx8SF*WZDq$+E3mel5t&ZqA zqCS8KMK#9nq$Q`53r9@atpaREZYCC*@};cf``ju|Ro8$*xPiaH~#Q~DAOl8SI` zzl6<=(2LZaqX*BU6cXyYNCxiZG6czzOzW|#MDMgvqT(sjY>PN8{*%T&yn#YN2yUoi zHt;^nPp!-5-m?q0)GM4WAgN44i~dY|CH9oA@FGZWmg+q zAo9cz>x0mBy|-C=cPLP7zh5Nk!4F#(ZGDmVdYBr~seCcHg2n}?8?&C%9X;N^l3IPg zU}2xr`JWyp(AyL3OA+zeA1JwpV3gmpr zb}0fypVM}n2)&lOM=B}bYT8%|i&%tzYn`Ue?;civb&M(3OCqE8`Bi|2aRqps1UE%omI`06R$Ei`cT9hfVvi}OaTzBay;L*I z*~h54gf{hIoYMk@na~>16`k(n8|+Uf@IkZdLcq1#qUP^x?mxG=AG4x7Om+QgLG1Rq z$+%2s#Xo7V-EohZfTQ62AD%@puvjw5A6)(lv@I%zY7&sVUxAy=TF-860!6U?u4lTY zP!91&k6s83HiUv!?Nw*{If=*6ULk*B0o*%2Y-C+g6}EXNqN8EAbmBEjm!83;EQ&CV z0#_Oj4$9_JrI>b!0k_|7@0}0Rl}R;-l-DPMFI`!JxO^5AJ!gM=6i{dOS<2cg=Na6k zo!Rs9QU;?0BTQN~VI4GLc@B-TeXe`mTcTi)s+#ciu^-OIaFol3t&t#Pw<>iz%;`XZ zV-3RE?Cac|I|8vxZVZbaYb4!1@7vt1O8L|ia<2PV@qOWL#?hpK2kH#f#|WNLXUMDx z9A7wDT5GO3L1{z9bMknz#w3&Okr5Q{m#O6emCWUgQn`vNYj~$)Zhrr01>X^`pP)#~NkMO~AC2E`gVbxOl+CH8&*6EXpGqKA}PKks|u= zh>+gfc1c|0COl>q^-sCr!mpp!wlm5oADf?VAWbPyjFR3Q^3&eznN!|(e7UPhzX z4gU^x%Xp)Kph`^wsXT@M!&j&({-E8+8?1Pw}4W;_aWKr&H{?+Cx+vd2Nm&$Vjc^{`*%X@`GjWpVXW8oKx^6){2RAI)HtAt zA#W$W8gNS+5y+rJ?-+ZGvU$Qd0%+FfELt!kVm`?_6@a^$6y1GG*&I=biND#1QV(rQ zZy9{DK%-1cJ};g|v@%Rgy~xg&)-E^QIxr1;eSw`I(`4*^WE-F{#?2X;d6z%6EX8m-OanM2Plp=50_B2jZ%-4j*1pKi3{e z^E5JcBz)>wE~3^UScVzTd=RWUiL)+KuU|uAa5!xl9&`$kM7iW>%E5C@|NOh-BFF|% zmsPe-H=87EVbUnHf%)#{{!fM|YnE$o^sn_MWO5H1ay19BcJ(BSSO-c9?dF;^kBh`} z(a&X*?m!g>+na~K0=aUXdTGsPaH0?QGs@bVCSIMXB>cwZ!_qPu_4DS|!3Uxm|ljZ8>CQ4T86}4ict7>(f zB&-Mx_94xAj+8ngC;4QKYUH@kohY#kxMF(Ie-Et!KP#|uUa;TmRNth7fYp^q>g+TJ zfCaL#Fk@jeEtF6+19v5*t+7ym(^N`3-_gSAPRYg4$Qw#7m*XEL4ive**$oT$F9GE z*&uBr5^W@<>|^dIdwafEE4Dr_P3#^>H8tnLKHTc@fW`YX4+9Z>#RPYHAKUB`S09lZkTLB@VkfiFYLnYoHGRTI$6f*k!de|sCL;L< z+WK-$1>-ao?ind2VcI;agxjt?BIM){Cu?#%7?gywUPN7GQz>72aA2jHZk-VO7-vMU zDZ2u~A?}$PV}$so#wF;V!MKjF6K`<~u?l1!EKrZfIE28PA)J@{it-=PsIDFbB`O=i zB=Ki&K`zq}G^6T-=0_@|>qpBZ9Xz`W{dI%`38o;x`R<-KIHO^5c1AA7K3T6iB`tsf z6)-;(4|-fBnsK|jQzc$62uQH0tRm_;5Mv`52A6Ws-5S>3h~{uB z%65QGE2qO~i%3&|WhU0)f~1$Do|%D6qz3cK;{uj2An?8-LRe^epVv^W({7D)V+F>f z@GO-*0h+d`G>T#YE*&n$M*?pgK|vEdK8q&r zqa_B>pXN3Wlp$xyR0d&H9J3S-N#bhqhrbx18`t#mW>=l*KnZM;3p=NTDD<$UoH+O4 zSj`MG5~M3A{h*ke0&rM75d|*xKR&n z-pud980vQ9dC;>Ff^JuoU6#)vPnfptoIc-hf9&|;K3{fIhJ*Z5I1EMp#_<9(un6aYdJ1)L6uTg z$jmEk8-r;!cA1jl-{Djd9iEauwp3oo4FdV3laKhakgU+nmEj3&bPtcFn5Q^pWoY*& zfv<(=+m#hrO}OO|5m#?+|i}*Y{(K(z?iVrh5(M*YQ?|k~9xCx$qWwdfh z!{nfug%pTRw*N+XOM$Q${w+=0c)K3zIV8&+2ao4o6wW+kr4y6kqn|{4N34#=Xj=0{ zSibVdq>JF_k_yHxB!bDi?u+5@&lK1q>DZWgilIgY=p3IIbAisY_wGE*vOW?T$wq^8 zvXU^W-h6Sok9s(nNZv>gSGMk6J8>Be=UAJfC0!ujmYy@~;!+ZW`mtg?a66bdW-2r= zDo)+tf)J}|*l(iRXr3RAPAMQhq9cqscigOarebyn(Sf3>>jF<@p4i70IUVS3gbAy$ zDvrDDLMqTqm~(4eu)l6+HuKyxjKeQ4aaSKg7A}CSlk!aw1NHJW8}_!^SrnSMYhQTV zck3io<*oGO{MmY~F9zciRVGT7>ZI6$qtEGR9EQfV`hd^<`7-Qvs8V%zskiyh-bbBk znPdv%>JbXZKHY27nQYL#X{XI4%V>bT6=ZTA+|{6waMz_UMYmE9dn^5{F}6jHMX=7m zT?Jd(&Tp5g#UoSs1V-tKn`|vSf^>R{zjot2HyzPXa$(BX%)*e(7Gt9zJhFT#)=MZ> zo8Q{TCi!ho!GHa}41VP|{w^U9fH=RIGXo(QhWkjoULltS8IiVqm0cK@6me@Vbf{bg z^`~chQt$HpS@LBJZ8THzwB1?D2uD472%KpEIQkRCF31 z&!S%%v4ih1z{yy@nunq&Zw@m7q1vBoP&{yI5H?-d=e3z}mDU11(Pl~D64+sC07&+!iJ9}shHQ4WjfOrZ^N98J2xk5WB}oUs==KAHuJOW%9xjxJj#Z~f_+4c@tXFb1d8m?3S|B=cRF z*^D8EgT#n%=m=VMwtFLi1~?K?WGi5}x(10J?z(6rtI1YAja;sckit@2@fh*7NiXLYtd{^CA2DYK3{gs0%WJ_2 zn7PROIT)l=sS^{nET#hemIUGXi3r@E$+g79e@^<85A ztb4VAP`GFoBDn29pohjzaG@Z(b-Idx7?)EpH`9oOrRW`|WsNm~%)nPZ<&#cQK%d?F{GeLzC&zH3ssTyBNK9g+szeYax{lpGMP zB0i6_tG>NhDrgxFajWCF(N7sOLG|Vr}RXR~6RQvlPW*J+PtV zJqlHEp}y%toUIAOCcfg&w|v^W6|Ov0^ruB=ofb+P&D~|qecOB7taIq$;6?_KrFKw5M>#ti5V?nOQ4HZ(+9!$Wa176D zT)uew@`v-KJ44{KJ`62TspB*n<1&Hf?j7%FB4s`+^sb)7N9f~rJbd=~7(h`)h7k$iiU@+9KV>FnK5AWb(yf3&aRzH-uJGFWqN@oQ=s;#P*g~Wu1@I9;pWz?x zT1VsTk_>{2CLf+N?@D4jbEdUYs+K*L(LpjvG+<0B{tBN1mDX<}!Yec6oXhH|)wj_U zQWBQ|?iFMSIvNvN3E5@AX^Of_3fxJNX4h`6wPE1%USRc|Z?L2TOF~Cnu&`%zV)OyA-SJnOuF0kMcN#`XIT^A+a{EdYIKhvvjzRhO zUdcOKOtiQkAO@NbS6V1gw>?ezgo)Q&;k!xY-JMAQBM_hQ?iN_~xZ=cR=F1~6kEsL0 zkFs&kOvwN1lQ@+QkS|Yfey76sAtULAVE1{qu2L9b?@9bc1Y9Pz`JrF z&W^{Et%9N)e$-DxeRL?A2-4u3PGRtwH-?7-D z{eoZ>p2L9Tk7vepCl6`$5y=T~BFv^({;JU~M}MYZe$4y%9Eb)@^eLnK>xD_&f(Df5 zcANYO;)|_S1xDuW+=jb(kd@8c-O2Gb7=_B@7-oy{Xa}9V+IH?s4^H>J4UL4bJnxtX zZ27e&Ldz@}1|McYpDC$de3JF4&0jrCPv{QO0v8{8OZp^4`@(BzTYCZbo7Mt;ZJ|x> zXQWpHnb7w`H<)#{X4qd$*#UG~_}bMe)U1i{4x9N;J9Yw^#QjloA8ss)BhHqJ_W~Ub zTo)ytS>xNehsca*%rzE#W;f2k;!HV^Kwh$rk_zTx=qeMXk%Sn)OGSdx(6)LwCE9x* z9UG)f1i1MkY?DYVujNSs@3wm74oX5mQZU`_;&R3^Xd%{G(se7-6V+_t(Zm}O8V^52 zWEgZCs^~n}SH#1nneG%Pl!vxzf1t{E*Cx3(%(>VY;!PEmqkzIS)YNh@p2W5X@vZ>H zMv~F2P_ga|Zn#ttJ8+YX>+Y#noI^kM@D<9$|P86v0Ihe zl#w1w%f#1Z9f==yqs+XQ=CW26#p~0eZO=eM1i#dFa#A(d=aLSLMH}w6Q7kxF2RNKA zMX-nGnTh3zsOnp1nux65LL{2KT*2DN2Kt4^vlyChtiQba9E@TyJ;4}5Na7CW9++;_ zNap8fc)TOo@S$7ZTDI~E3p)npWNb^H-mr8HJ4LzWlb?j5uW7X9f<6v9aio7bLeg>W z9jqxrLwe^~WEWb+sWb*e6a4I6aG;vbV6L_M{VtPu!M5F2`4gOQh|?OoXRwu$ic`r+ z=|1}tHnqORW+2Vo#IjyuIE7b*s$DBi8^jdoq8m43eT3*cl+zi{oR@X*Jw-PJX5AaT z`=0BdbsA*FvNiL%_$~{XsP1gtooUbU?lUKpBsf@wjclQQaC_)=8JD}SVXK1-GGEL_ zA9SIDOI7B__>DbFBj|X&>m!V39%CLi!TPVM3g*_`S!69|4sW=2;XBGtc8-?w?C&DbqId>?MQAmbj zGiP;5|3lT7c3SVnX9XrVwxn|;9gjROA|gu5(x0pWAb@MMchkUNqg)m7JK{1K+=n}v zr9h#Htyj4qD0Smmh@{@-kqsjQdGDfJR2#VN<(wlrFNgzR2!I;E)eUq-$T4ttMRIv> zf9MPpCBSW+80ZLA(@7c~OX3w~lp-26aX2h%=(CBuXudM#7Ao=>rV(}N+tfugR{33C zF5B%@Msd=U6@rz(?M*(nC38@Iqp*Q!K}g23AkUmYT7-Cign8mVSq%*fg5+RnsL_oZ z!EbEgFg)cs2~R#FTd1!Gx~~vLqoBT^Z_ci#XND`~3GUR2Q83XbmIHc1{w-r}=tdRQ zIU>F;6J}Y*Azk4GcGFr#R9T8o+QF3Z@<|oAMeUNsxw&6PdyjWULm8 z^@{WAPn_l_%Eyk0bUre(KslpIeVEb z%3Y#0hD&*h@#{=)m+~cUm>?3an$#3Tuug0oGtwmmL^9atp`am7=CvFV5jhM3i0blJ zus}{7c$7aLxiU6WlI3hG?%&L&V=%~d59~W^mxXJ9V}&+uh2R1h`WFn-i0bW%zJ47x-5bF%DXrG= z&5)p$pn9?QVF3(>y6zIqhQluu5f1Y^0xhkLvf->F^PkiU_0xim_>(gP*y-WU><_#o z;jeUMacOV_xi}T-pJWDD%LqplQJh$lmpmazsG4z`DTmgnPFlK}jb!2ybp{dn4z5`Y zfavedna*TRT~wRK&R%Ld=o{pbpD5ZL+9As-t4UGsE|AG-OYTojKJyib5DQ_)cSSyn zcz57T-o3tKugX3c!}bi9#joBMSURUQ@gcTljxVxbjWhq!KH~cEzX+Bn^7{d5s18#a z*Xf#>8VCXB$XSfHjeiBGwPA(!(@wP#PKtx;Z08Fb%8Xv=TeV{>*NB5?(1j}oN=4e65)^^tHHFL|)cnzh6 zn#ULqH7*+Z`&0E9FtpHh?$zfOL{gSfcCM|@lq8xuMi?D4)s>Mhd%*z^EbWZ(AbIq>HE$TEId;Nl)Kgvs}tWaT>dmcc4)xzDP$T4jP)3{fPDD7iL;O z*8t*jlQVS~f~P4_`U)_N&aJ~?yYWw6uoJB0#luDKrR3$p<#baaw(eqf*G2ay5!Bt9 zZ}Jh0IlnjU)Vq&sv|$5Z^t0y&hXm2{RSq8s+AkM&b&UzXV>&W)tJLL}M?>N* zn|%@;gyXU{^aAt##9V=br+7VU=o%*t-R}0XU^Z>8i5zwyVHj&}B;JIM3me`8;ey(D zDyyUE%ee#tXNxp8ae<>C5mjl~VMkVJ*ir_GqbEi|n%uxF5&y7aR2aG$Am zeT`0>V1fhI+FWWdQZO@7lVh)5g-!r8ZvRU8X&z*MG}lBegu!}g$Y}<9HujUCSlfymseiFbLddjZtI^(*(DA2 zV(3nLQj>U)2$OIa`0$>uc@t29OQ-ArwZN1fDP&L@G5p%t*2X4si{3lxK?iPjP)r>9 zdN^2*B-u4!FU#)mp#HMjdm=32bm1c#NTdA9SO*i3N0Q_2&|_n>%S1}^VClJG=>ak0sJ+rE9ejpmFNbGOLl8s+T)v9uWgu;k)L{tC?*bY*w7K8IBQZdF5=!-&Hzt zSjt@7cliFHk4GP$Hv4A1G8FKCapPR+>)XX!7V~_(GTW1N9ww5wTWJ%~-YY9{zJQp* zazlkqYed92yC4Ze&TWzV3TUya_bX@{i=a}GC#oc8MD9$?HjnHfTNUd8as4)XvA zUTrnbGLxGoeAit?Iz>D7l$n$n(eWX&JR(6%xNft@qW`fGDI^bhiMyB8&v@VaJcucf ztp8}*T2OwI?Tj6$3xPf)TvKF!k{%geaX!>m^R;MuZ*R=5*>e~}c<`ilnOTulQWVz{ zd3;I&pWlmTIR_**V=F__G9^|KA;_q zEoGm>rg)om;CqFN25KI-q2LW=GWCTgKi+*)`D_Ag!sA&was-|q_rRMKoE(|?X5#V& z)UY(XnR*sZ752yQKV#@yMtPYWXnF z`|%JM9s^07YGJHu2#^%d4+IWSF(?W*r0? zz>e%b?wEo0KIIk(hXz6o^Ue+(=E_jEhG#M~taB`6dKZ(k?wxKcIb1cKLHH7g{np z^0H2xF5Lhv&Hx{1=xrC+z-&T};)vFl#3}{4lw1{&sw&CfolF#E^gF*CwAmgg4&Okb zB-@3e54puBxHrYbiQqKw0lv_pWjsQ&jA)OJ>EM39n}!}77p&AERJKE%`4V|I>4VzH z0?g;;h5e`hXSXY!XQ$fcT0jp+Y+pGZ|HaRt%HN`AjLuc`xUFC9P@9ne4eQQfm{6ea zPP22Rc;APNp3`72(y39_8BFV*y>ddK&to`uM6uDGafMDzC5De!cQ-yNu`W#Dn!t`t zdSEH@Z_IOm_H-Myg+?V2A;kj{Fk#dNj|36d=5G`Hm`4%QWRevg8it0AR#MNHfg7-S zih{w!4e=t2w5MTWxoF0D@7f1YH>*k0KokH7M?bU-3cW+!1IDgyE?bP$)FT+?6ZExK zU-4@Thro?w4`@R46W0XeYZF&Zd$omy*G)^)h2kc6zCR)*C{(JaX>4$a&=0g6L}U?E zxB)ll$)}srRQ39@HIr|qCeotP(cLb&>J)8Z*)e@~i(^Nb1N)iD)~+Uw1yh}Ssb6LBty9>t|CY;_-mvRY9W{Qe2AlgV{uT3PHbr}9@RB@gswM~^*DzU zEk{1Oz)w36$1qwQk)vPQ(hmgze$Bcaqk~OJM9t@;#uOoaVco3!Nvei0u1CeRnt?(+ zHGZ-c>VD%5bJlR;Zi~(ghG*g{luNs45F#lDs**z`$zK7^oG;>o4E{D1r15wI{k6rF z^{+sI2!C*xlGIttn7l@D#g-kgV`lJbo1x(O$gv<-=DRM*@ zVb4Z(9k*WQ{KbO=f`60m?KQh}_6+0NzDDluFGj&-EHd;Z!&h^mRvEP=n#xBm+D}<@*C_~3Y_eM>XstaM0g3yp#mGOd^BrL zql6#2{u@3 z^?2F+W9ROE^nU&3@sk@j5C6_vR_v30mHW8O From 70b25cf2afcb4c85428bcc898f5f38aae74bb44f Mon Sep 17 00:00:00 2001 From: sorrel Date: Thu, 8 Feb 2024 22:34:57 -0500 Subject: [PATCH 09/16] fix invalid html issues add doctype. remove duplicate main tag from page-builder. change spans to divs where there are p children --- oxaliq.net.rkt | 4 ++- source/index.scm | 77 ++++++++++++++++++++++------------------- static/style/styles.css | 24 ++++++------- 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/oxaliq.net.rkt b/oxaliq.net.rkt index d9008a4..3ad3175 100644 --- a/oxaliq.net.rkt +++ b/oxaliq.net.rkt @@ -176,7 +176,9 @@ (define (make-page resource static-write) (string->bytes/utf-8 (static-write - (fragment->page resource)))) + (string-append + "\n" + (fragment->page resource))))) (define (fragment->page resource) (xexpr->string diff --git a/source/index.scm b/source/index.scm index b4a116e..e03dac6 100644 --- a/source/index.scm +++ b/source/index.scm @@ -1,6 +1,7 @@ -(main +(article + ((id "oxaliq-dot-net-index")) (noscript - (span + (div ((class "noscript")) (p "hey! yr not letting yr browser execute javascript served by my page.") (p "that's cool!") @@ -24,42 +25,48 @@ a nice time building this little thing ") (p " i hope you have a nice time looking at things here") (hr) - (p (span ((class "hx-target")) - (a ((href "/this") - (hx-get "/hx/this") - (hx-target "closest span") - (hx-swap "innerHTML")) - "(how i build this little page)"))) - (p (span ((class "hx-target")) - (a ((href "/now") - (hx-get "/hx/now") - (hx-target "closest span") - (hx-swap "innerHTML")) + (div ((class "hx-target")) + (p + (a ((href "/this") + (hx-get "/hx/this") + (hx-target "closest div.hx-target") + (hx-swap "innerHTML")) + "(how i build this little page)"))) + (div ((class "hx-target")) + (p + (a ((href "/now") + (hx-get "/hx/now") + (hx-target "closest div.hx-target") + (hx-swap "innerHTML")) "(what i'm doing)"))) - (p (span ((class "hx-target")) - (a ((href "/about") - (hx-get "/hx/about") - (hx-target "closest span") - (hx-swap "innerHTML")) - "(who i am)"))) - (p (span ((class "hx-target")) - (a ((href "/contact") - (hx-get "/hx/contact") - (hx-target "closest span") - (hx-swap "innerHTML")) + (div ((class "hx-target")) + (p + (a ((href "/about") + (hx-get "/hx/about") + (hx-target "closest div.hx-target") + (hx-swap "innerHTML")) + "(who i am)"))) + (div ((class "hx-target")) + (p + (a ((href "/contact") + (hx-get "/hx/contact") + (hx-target "closest div.hx-target") + (hx-swap "innerHTML")) "(how to say hi to me)"))) - (p (span ((class "hx-target")) - (a ((href "/very-earnest-disclaimer") - (hx-get "/hx/very-earnest-disclaimer") - (hx-target "closest span") - (hx-swap "innerHTML")) + (div ((class "hx-target")) + (p + (a ((href "/very-earnest-disclaimer") + (hx-get "/hx/very-earnest-disclaimer") + (hx-target "closest div.hx-target") + (hx-swap "innerHTML")) "(a very earnest disclaimer)"))) -; (p (span ((class "hx-target")) -; (a ((href "/links") -; (hx-get "/hx/links") -; (hx-target "closest span") -; (hx-swap "innerHTML")) -; "(some things i think are neat)"))) +; (div ((class "hx-target")) +; (p +; (a ((href "/links") +; (hx-get "/hx/links") +; (hx-target "closest div.hx-target") +; (hx-swap "innerHTML")) +; "(some things i think are neat)"))) (p (a ((href "static/license/license.txt")) "license")) (p (a ((href "/tagged")) diff --git a/static/style/styles.css b/static/style/styles.css index f9a3a1d..373b7f1 100644 --- a/static/style/styles.css +++ b/static/style/styles.css @@ -35,26 +35,26 @@ h1, h2, h3, h4, h5 { font-family: 'Courier New', Courier, monospace; color: var(--background-color); background-color: var(--visited-link-color); - padding: 2 10; + padding: 2px 10px; } h5 { - margin: 2 0; + margin: 2px 0px; } -span.noscript p { +div.noscript p { font-family: 'Courier New', Courier, monospace; font-size: small; } -span.hx-target section { +div.hx-target section { border: solid 1px var(--link-color); border-radius: 4px; - padding: 5 10; - margin: 3; + padding: 5px 10px; + margin: 3px; } -span.hx-target footer { +div.hx-target footer { display: none; } @@ -78,7 +78,7 @@ a:not(.ascii a):not(a[hx-get*="hx"])::before { } body { - max-width: 600; + max-width: 600px; margin: auto; font-size: medium; font-family: sans-serif; @@ -128,21 +128,21 @@ nav a { } p { - margin: 12 0; + margin: 12px 0px; } ul.tag-list { display: flex; flex-direction: row; flex-wrap: wrap; - margin: 6 0; - padding: 0; + margin: 6px 0px; + padding: 0px; } li.tag-item { list-style-type: none; flex-basis: fit-content; - margin: 0 6; + margin: 0px 6px; } img { From 88bef35a83e0fc0e9cb51e5a16ac0c328b8e0a53 Mon Sep 17 00:00:00 2001 From: sorrel Date: Thu, 8 Feb 2024 23:41:11 -0500 Subject: [PATCH 10/16] fix href in tagged/tag post-preview in publish script --- publish.rkt | 4 ++-- source/make-index.scm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/publish.rkt b/publish.rkt index a562040..21d4779 100644 --- a/publish.rkt +++ b/publish.rkt @@ -144,8 +144,8 @@ [resources (make-weak-hash)] [posts (map (lambda (lookup/id) (if (hash-has-key? post-lookup lookup/id) - (hash-ref post-lookup lookup/id) - (get-post-data lookup/id resources post-lookup x))) + (append (list lookup/id) (rest (hash-ref post-lookup lookup/id))) + (append (list lookup/id) (rest (get-post-data lookup/id resources post-lookup x))))) (filter non-empty-string? (rest tag-table-row)))] [make-index (read (open-input-file "source/make-index.scm"))] [new-index ((eval make-index ns) (~a "tagged/" tag) posts)] diff --git a/source/make-index.scm b/source/make-index.scm index beba09b..ffa1110 100644 --- a/source/make-index.scm +++ b/source/make-index.scm @@ -43,7 +43,7 @@ (h4 ,(second post)) (p ,(third post)) ;; tagged posts will insert href instead of id - (a ((href ,(first post))) + (a ((href ,(~a "/" (first post)))) ,(~a "go! to " (second post) " page"))))) From 9aea82ad590354b28dbd6bb6c1955ef63bc3096b Mon Sep 17 00:00:00 2001 From: sorrel Date: Thu, 8 Feb 2024 23:47:21 -0500 Subject: [PATCH 11/16] manually change href in tagged/tag source files --- source/tagged/about.scm | 2 +- source/tagged/conlang.scm | 2 +- source/tagged/latl.scm | 2 +- source/tagged/programming-language.scm | 2 +- source/tagged/tool.scm | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/tagged/about.scm b/source/tagged/about.scm index 36efd6b..9254104 100644 --- a/source/tagged/about.scm +++ b/source/tagged/about.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#about")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#about")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "now") (p "what the author of this site is up to (not computer things)") (a ((href "now")) "go! to now page")) (div ((class "post-preview")) (h4 "contact") (p "how to talk to me") (a ((href "contact")) "go! to contact page")) (div ((class "post-preview")) (h4 "very earnest disclaimer") (p "being earnest in the streets") (a ((href "very-earnest-disclaimer")) "go! to very earnest disclaimer page")) (div ((class "post-preview")) (h4 "this") (p "the site this bitch made") (a ((href "this")) "go! to this page")) (div ((class "post-preview")) (h4 "about") (p "about the bitch who made this site") (a ((href "about")) "go! to about page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#about")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#about")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "now") (p "what the author of this site is up to (not computer things)") (a ((href "/now")) "go! to now page")) (div ((class "post-preview")) (h4 "contact") (p "how to talk to me") (a ((href "/contact")) "go! to contact page")) (div ((class "post-preview")) (h4 "very earnest disclaimer") (p "being earnest in the streets") (a ((href "/very-earnest-disclaimer")) "go! to very earnest disclaimer page")) (div ((class "post-preview")) (h4 "this") (p "the site this bitch made") (a ((href "/this")) "go! to this page")) (div ((class "post-preview")) (h4 "about") (p "about the bitch who made this site") (a ((href "/about")) "go! to about page"))) \ No newline at end of file diff --git a/source/tagged/conlang.scm b/source/tagged/conlang.scm index 24701a2..06f6378 100644 --- a/source/tagged/conlang.scm +++ b/source/tagged/conlang.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#conlang")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#conlang")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "1")) "go! to feature-change-applier page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#conlang")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#conlang")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "/settled/1")) "go! to feature-change-applier page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/tagged/latl.scm b/source/tagged/latl.scm index 6937df2..6fa3c1d 100644 --- a/source/tagged/latl.scm +++ b/source/tagged/latl.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#latl")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#latl")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#latl")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#latl")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/tagged/programming-language.scm b/source/tagged/programming-language.scm index eb90141..3b8b9a9 100644 --- a/source/tagged/programming-language.scm +++ b/source/tagged/programming-language.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#programming-language")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#programming-language")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#programming-language")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#programming-language")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/tagged/tool.scm b/source/tagged/tool.scm index 37095da..7cafb01 100644 --- a/source/tagged/tool.scm +++ b/source/tagged/tool.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#tool")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#tool")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "1")) "go! to feature-change-applier page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#tool")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#tool")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "/settled/1")) "go! to feature-change-applier page"))) \ No newline at end of file From 2e134c764494c84498def2825cce6dd5dc50b982 Mon Sep 17 00:00:00 2001 From: sorrel Date: Thu, 8 Feb 2024 23:50:58 -0500 Subject: [PATCH 12/16] change git.idea-log and git/in-progress links on /this to in-progress branch --- archive/this.scm | 4 ++-- source/index.scm | 3 ++- source/this.scm | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/archive/this.scm b/archive/this.scm index 0be2f58..1fc61e2 100644 --- a/archive/this.scm +++ b/archive/this.scm @@ -30,9 +30,9 @@ "#lang cli")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/.dev-log")) "you can read about development here")) - (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/.idea-log")) + (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/in-progress/.idea-log")) "you can read about my vague plans here")) - (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/in-progress")) + (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/in-progress/in-progress")) "or read works in progress here")) (p "the image in the header is a crop of the work " diff --git a/source/index.scm b/source/index.scm index e03dac6..a64e637 100644 --- a/source/index.scm +++ b/source/index.scm @@ -1,5 +1,6 @@ (article - ((id "oxaliq-dot-net-index")) + ((id "oxaliq-dot-net-slash-index")) + (h1 "oxaliq [dot] net [slash] index") (noscript (div ((class "noscript")) diff --git a/source/this.scm b/source/this.scm index 772a189..853542d 100644 --- a/source/this.scm +++ b/source/this.scm @@ -1 +1 @@ -'(body (section (hgroup (h2 "how this site") (p "some kind of colophon")) (p "all of the code for the website is hosted and deployed from tree, " (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net")) "bunk computer club's git forge") "i do almost everything in the main branch, cause it's just me and that way\n i can add links below to the in-progress stuff real easy") (p "first, this website doesn't do anything to know who you are or anything.\n this website is a ~20MB binary and some static resources. it is built\n primarily with " (a ((href "https://docs.racket-lang.org/web-server/")) "racket web-server")) (p "this website serves ~46kB of javascript in the form of " (a ((href "https://htmx.org/")) "the htmx library (minified.)") " i don't love serving minified code. forking the library and removing\n features that are of no use to me is on the agenda for 2024") (p "everything here is hosted on turtle, " (a ((href "https://wiki.bunk.computer/hypha/servers")) "bunk computer club's shared application server")) (p "there's some racket scripts i use for tooling that were made with " (a ((href "https://docs.racket-lang.org/cli/")) "#lang cli")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/.dev-log")) "you can read about development here")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/.idea-log")) "you can read about my vague plans here")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/in-progress")) "or read works in progress here")) (p "the image in the header is a crop of the work " (em "'Oxalis acetosella', Otto Wilhelm Thomé (1885)") " run through a generation tool on " (a ((href "https://www.asciiart.eu/")) "this art archive"))) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/this.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/about") (hx-get "/hx/tagged/about") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "about"))))) (hr) (p ((class "doc-history")) (small "published: 2024-01-18T22:19:43")) (p ((class "license-info")) (small (a ((href "static/license/license.txt")) "license"))))) \ No newline at end of file +'(body (section (hgroup (h2 "how this site") (p "some kind of colophon")) (p "all of the code for the website is hosted and deployed from tree, " (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net")) "bunk computer club's git forge") "i do almost everything in the main branch, cause it's just me and that way\n i can add links below to the in-progress stuff real easy") (p "first, this website doesn't do anything to know who you are or anything.\n this website is a ~20MB binary and some static resources. it is built\n primarily with " (a ((href "https://docs.racket-lang.org/web-server/")) "racket web-server")) (p "this website serves ~46kB of javascript in the form of " (a ((href "https://htmx.org/")) "the htmx library (minified.)") " i don't love serving minified code. forking the library and removing\n features that are of no use to me is on the agenda for 2024") (p "everything here is hosted on turtle, " (a ((href "https://wiki.bunk.computer/hypha/servers")) "bunk computer club's shared application server")) (p "there's some racket scripts i use for tooling that were made with " (a ((href "https://docs.racket-lang.org/cli/")) "#lang cli")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/.dev-log")) "you can read about development here")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/in-progress/.idea-log")) "you can read about my vague plans here")) (p (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/in-progress/in-progress")) "or read works in progress here")) (p "the image in the header is a crop of the work " (em "'Oxalis acetosella', Otto Wilhelm Thomé (1885)") " run through a generation tool on " (a ((href "https://www.asciiart.eu/")) "this art archive"))) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/this.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/about") (hx-get "/hx/tagged/about") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "about"))))) (hr) (p ((class "doc-history")) (small "published: 2024-01-18T22:19:43")) (p ((class "license-info")) (small (a ((href "static/license/license.txt")) "license"))))) \ No newline at end of file From b64d7d47e0c4e2bc4d677fb11a586d924f1cb948 Mon Sep 17 00:00:00 2001 From: sorrel Date: Sun, 25 Feb 2024 20:15:24 -0500 Subject: [PATCH 13/16] change resource id schema to type/headline --- publish.rkt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/publish.rkt b/publish.rkt index 21d4779..e2b0776 100644 --- a/publish.rkt +++ b/publish.rkt @@ -88,10 +88,8 @@ ".scm")) (error "'root resource requires headline"))) (define (make-res-file-handle x r id) - (if (< 0 id) - (path->string (path-add-extension (build-path (if x "publish-test/source" "source") r (~a id)) - ".scm")) - (error "~a resource requires r-id" r))) + (path->string (path-add-extension (build-path (if x "publish-test/source" "source") r (~a id)) + ".scm"))) (if (equal? r-type "root") (make-root-file-handle x-test l-headline) (make-res-file-handle x-test r-type r-id))) @@ -144,8 +142,8 @@ [resources (make-weak-hash)] [posts (map (lambda (lookup/id) (if (hash-has-key? post-lookup lookup/id) - (append (list lookup/id) (rest (hash-ref post-lookup lookup/id))) - (append (list lookup/id) (rest (get-post-data lookup/id resources post-lookup x))))) + (hash-ref post-lookup lookup/id) + (get-post-data lookup/id resources post-lookup x))) (filter non-empty-string? (rest tag-table-row)))] [make-index (read (open-input-file "source/make-index.scm"))] [new-index ((eval make-index ns) (~a "tagged/" tag) posts)] @@ -225,9 +223,7 @@ (build-path "data" r)) #".csv")))) - (define res-id (if (equal? r "root") - (string-replace l " " "-") - (length res-table))) + (define res-id (string-replace l " " "-")) ;; before anything else, open output file ;; doing this means that if a file exists of the intended (define out From ac176553f81963bbb9c2a9b57c388c07a2431edf Mon Sep 17 00:00:00 2001 From: sorrel Date: Sun, 25 Feb 2024 20:45:11 -0500 Subject: [PATCH 14/16] proofread latl-primitives; add structure --- in-progress/latl-primitives.scm | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm index f4b0770..23146b0 100644 --- a/in-progress/latl-primitives.scm +++ b/in-progress/latl-primitives.scm @@ -6,11 +6,11 @@ ((id "intro")) (hgroup (h1 "what must be true of latl primitives") - (p (em "what will latl need to ") (u "do") " out of the box?")) + (p (em "what will latl need to " (u "do") " out of the box?"))) (p "i've talked a little about " (a ((href "/unsettled/1")) "conlanging and latl") " previously here. the short version is this: making languages (for theoretical conscious beings) is fun! it's been a consistent hobby and artistic pursuit for me for much of my life. i've had different approaches from making extremely regular languages, to simulating the evolution of a family of spoken languages, to a family of synthesizer languages for a fractured machine society. every language project requires keeping track of a dictionary and a grammar (even if they never become more than quick sketches) and any sufficiently involved project can benefit from tools for generating new words that fit a language's 'phonotactics', generating derived words based on grammatical rules, simulating language change over time. conlanging is a hobby with enough overlap with computation, that some conlangers have created tools for some of these tasks. my own projects have become too ambitious to have my work live in spreadsheets over here and latex files over there and text files with the defintions i provide to web-based tools somewhere else entirely. i want to build on the work of those came before and create a substrate upon which any tool a conlanger needs could be built and in which i can define the entirety of a language in one system.") - (p "at it's base latl will be a tool for operating on languages, invented (or otherwise... maybe.) it helps then to think of the sorts of things that encompass language. spoken and signed languages will be the assumed base case language, as those are the things real human beings usually use to communicate with each other. the modality of a language needn't be important to the primitives used, but it's always a good practice to state assumptions")) + (p "at it's base latl will be a tool for operating on languages, invented (or otherwise... maybe.) it helps then to think of the sorts of things that encompass language. spoken and signed languages will be the assumed base case, as those are the things real human beings usually use to communicate with each other. the modality of a language needn't be important to the primitives used, but it's always a good practice to state assumptions")) (section ((id "contents")) (ul (li (a ((href "#what-is-language")) "go to what-is-language")) @@ -27,20 +27,32 @@ ((id "what-is-language")) (hgroup (h2 "thinking about what language is for a moment")) - (p "by way of an opening query: what does a language need? naturally our base case spoken languages have sounds and our base case signed languages have gestures. for each of these, we have an articulatory mechanism: the vocal tract, or the hand and arm in relation to the body; and a perceptual mechanism: the auditory system, or the visual system. the unique thing about language among other forms of communication is how languages use time. it might seem basic, but it's easy to forget that 'my cat scratched the post' and 'the post scratched my cat' mean very different things. and the same sounds in a different sequence can become a smattering of ideas as in 'the my scratched cat post' or even lose meaning all together as in 'cra catsm sde thymst opsh'. languages differ on how they use time--some languages allow freer word order than others, but relationships between articulations through time are essential to all known languages. for now, let's start with those articulatory bits! (more on time and on meaning later)") + (p "by way of an opening query: what does a language need? naturally our base case spoken languages have sounds and our base case signed languages have gestures. for each of these, we have an articulatory mechanism: the vocal tract, or the face and hands and arms; and a perceptual mechanism: the auditory system, or the visual system. the unique thing about language among other forms of communication is how languages use time. it might seem basic, but it's easy to forget that 'my cat scratched the post' and 'the post scratched my cat' mean very different things. and the same sounds in a different sequence can become a smattering of ideas as in 'the my scratched cat post' or even lose meaning all together as in 'cra catsm sde thymst opsh'. languages differ on how they use time--some languages allow more freedom for word order than others, but relationships between articulations through time are essential to all known languages. for now, let's start with those articulatory bits! (more on time and on meaning later)") ;; 1.1 phonemes (section ((id "phonemes")) (hgroup (h3 "phonemes") (p (em "what even are they?"))) - (p "no talk of letters here! no \"'ghoti' is pronounced 'fish'\" jokes! instead, let's imagine how to describe the difference in articulation and in reception between 'mine' and 'fine' and 'wine' and and 'dine' or between ''. these words rhyme! which (for short words) is just a way of saying that most of their sounds are the same, and the similar bits come at the end. it is uncontroversial to suggest that there is a basic articulatory/perceptual unit in any given modality which, when strung together, produces the basic units of meaning. this basic unit, no matter the modality, is called the 'phoneme' (historically, called a 'chereme' in sign languages). i've already hinted at how linguists support the existence of these phonemes. 'dine' and 'fine' together form a 'minimal pair' of words with a different meaning that differ in only one perceptually distinct part of their articulation. human bodies are inexact things--perception is important here! it does us no good to describe an extra-tightly clenched middle finger in a closed hand shape as indicative of a distinct phoneme as it would be unlikely to be perceptible to an interlocutor and so could never disambiguate between two signs. environments are noisy and so articulation is also important! 'fish' and 'shiff' might be hard to distinguish on a windy overlook or in a compressed recording, but they are ") ;; TODO START HERE + (p "no talk of letters here! no " + (q ((style "font-family: serif; font-style: italic; padding: 1px 2px;")) + "'ghoti' is pronounced 'fish'") + " jokes! instead, let's imagine how to describe the difference in articulation and in reception between 'mine' and 'fine' and 'wine' and 'dine' or between '" + ;; add ASL rhymes + "'. these words rhyme! which (for short words) is a way of saying that most of their sounds are the same, and the similar bits come at the end. " + (footnote "rhyme is a little more complicated than that, encompassing stress patterns") ;; describe ASL rhymes + ;; awkward + "" + "it is uncontroversial to suggest that there is a basic articulatory/perceptual unit in any given modality which, when strung together, produces the basic units of meaning. this basic unit, no matter the modality, is called the 'phoneme'." + (footnote "historically, called a 'chereme' in sign languages") + "in selecting the words i have, i've already hinted at how linguists support the existence of these phonemes. 'dine' and 'fine' together form a 'minimal pair' of words with a different meaning whose difference is found in only one perceptually distinct part of their articulation. because we know from english language usage that 'mine' and 'fine' and 'wine' and 'dine' are distinct words with distinct meaning, we have a clue that there is some phonemic difference between /m/ and /f/ and /w/ and /d/. by collecting more examples of these minimal pairs ('do' and 'moo' and 'wed' and 'dead' and on and on) we can begin to describe the physical sounds associated with each phoneme and how each is articulated.") + (p "human bodies are inexact things--perception is important here! it does us no good to describe an extra-tightly clenched middle finger in a closed hand shape as indicative of a distinct phoneme as it would be unlikely to be perceptible to an interlocutor and so could never disambiguate between two signs. environments are noisy and so articulation is also important! in my dialect of english the word 'put' /pʊt/, in a noisy environment, might be pronounced roughly [pʰʊtʰ]. in casual speach, however this same word is frequently realized as [pʰɵʔ] with the only audible consonant at the end being the glottal closure of 'uh-oh'. the only ghost of the exaggerated realization is typically an inaudible tongue placement behind the alveolar ridge. a speaker recognizes what the phoneme 'could be' with more effort, but typically such effort is unnecessary for understanding. this suggests that there phonemes are not simply sounds or handshapes or mouth movements. something must be underlying the equality of meaning between [pʰʊtʰ] and [pʰɵʔ]") (p "there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are " (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. as stated, there's broad agreement that phonetic features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") (p "users should therefore be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") ;; TODO add some ASL images (maybe sound for some of the english bits? - (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock', without aspiration [stɑk] [- spread glottis] in 'stock', or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") + (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock', without aspiration [stɑk] [- spread glottis] in 'stock', or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] (or [ʔ] from the earlier example) whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstractions too much") (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie "(code "/t/") ", "(code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") @@ -66,15 +78,18 @@ (p "before moving on")) ;; 1.3 morphosyntax or morphemes? (section - ((id "")) + ((id "morphosyntax")) + (hgroup + (h3 "morphosyntax") + (p (em "where meaning and phonology and time start getting funky")))) + (p "") ) - ) ;; section 2. okay but conlangers (section ((id "what-conlangers-do")) (hgroup - (h2 "") - (p (em ""))) + (h2 "what conlangers do") + (p (em "moving from a pile of language stuff to a pile of problems to solve"))) (p "") (section (hgroup From 04f9401497288b6a13ddbbd2be6181815c756187 Mon Sep 17 00:00:00 2001 From: sorrel Date: Sun, 25 Feb 2024 21:25:29 -0500 Subject: [PATCH 15/16] split latl-primitives into sub-articles --- in-progress/latl-primitives.scm | 85 +++---------------- ...tl-primitives_proposed-latl-primitives.scm | 12 +++ .../latl-primitives_what-conlangers-do.scm | 11 +++ .../latl-primitives_what-is-language.scm | 60 +++++++++++++ 4 files changed, 94 insertions(+), 74 deletions(-) create mode 100644 in-progress/latl-primitives_proposed-latl-primitives.scm create mode 100644 in-progress/latl-primitives_what-conlangers-do.scm create mode 100644 in-progress/latl-primitives_what-is-language.scm diff --git a/in-progress/latl-primitives.scm b/in-progress/latl-primitives.scm index 23146b0..5bec1e2 100644 --- a/in-progress/latl-primitives.scm +++ b/in-progress/latl-primitives.scm @@ -1,4 +1,3 @@ -#lang s-exp racket '(article ((id "latl-primitives")) ;; brief intro - restate the problem @@ -27,91 +26,29 @@ ((id "what-is-language")) (hgroup (h2 "thinking about what language is for a moment")) - (p "by way of an opening query: what does a language need? naturally our base case spoken languages have sounds and our base case signed languages have gestures. for each of these, we have an articulatory mechanism: the vocal tract, or the face and hands and arms; and a perceptual mechanism: the auditory system, or the visual system. the unique thing about language among other forms of communication is how languages use time. it might seem basic, but it's easy to forget that 'my cat scratched the post' and 'the post scratched my cat' mean very different things. and the same sounds in a different sequence can become a smattering of ideas as in 'the my scratched cat post' or even lose meaning all together as in 'cra catsm sde thymst opsh'. languages differ on how they use time--some languages allow more freedom for word order than others, but relationships between articulations through time are essential to all known languages. for now, let's start with those articulatory bits! (more on time and on meaning later)") - ;; 1.1 phonemes - (section - ((id "phonemes")) - (hgroup - (h3 "phonemes") - (p (em "what even are they?"))) - (p "no talk of letters here! no " - (q ((style "font-family: serif; font-style: italic; padding: 1px 2px;")) - "'ghoti' is pronounced 'fish'") - " jokes! instead, let's imagine how to describe the difference in articulation and in reception between 'mine' and 'fine' and 'wine' and 'dine' or between '" - ;; add ASL rhymes - "'. these words rhyme! which (for short words) is a way of saying that most of their sounds are the same, and the similar bits come at the end. " - (footnote "rhyme is a little more complicated than that, encompassing stress patterns") ;; describe ASL rhymes - ;; awkward - "" - "it is uncontroversial to suggest that there is a basic articulatory/perceptual unit in any given modality which, when strung together, produces the basic units of meaning. this basic unit, no matter the modality, is called the 'phoneme'." - (footnote "historically, called a 'chereme' in sign languages") - "in selecting the words i have, i've already hinted at how linguists support the existence of these phonemes. 'dine' and 'fine' together form a 'minimal pair' of words with a different meaning whose difference is found in only one perceptually distinct part of their articulation. because we know from english language usage that 'mine' and 'fine' and 'wine' and 'dine' are distinct words with distinct meaning, we have a clue that there is some phonemic difference between /m/ and /f/ and /w/ and /d/. by collecting more examples of these minimal pairs ('do' and 'moo' and 'wed' and 'dead' and on and on) we can begin to describe the physical sounds associated with each phoneme and how each is articulated.") - (p "human bodies are inexact things--perception is important here! it does us no good to describe an extra-tightly clenched middle finger in a closed hand shape as indicative of a distinct phoneme as it would be unlikely to be perceptible to an interlocutor and so could never disambiguate between two signs. environments are noisy and so articulation is also important! in my dialect of english the word 'put' /pʊt/, in a noisy environment, might be pronounced roughly [pʰʊtʰ]. in casual speach, however this same word is frequently realized as [pʰɵʔ] with the only audible consonant at the end being the glottal closure of 'uh-oh'. the only ghost of the exaggerated realization is typically an inaudible tongue placement behind the alveolar ridge. a speaker recognizes what the phoneme 'could be' with more effort, but typically such effort is unnecessary for understanding. this suggests that there phonemes are not simply sounds or handshapes or mouth movements. something must be underlying the equality of meaning between [pʰʊtʰ] and [pʰɵʔ]") - (p "there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are " (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") - (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. as stated, there's broad agreement that phonetic features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") - (p "users should therefore be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") - (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") - (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") ;; TODO add some ASL images (maybe sound for some of the english bits? - (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock', without aspiration [stɑk] [- spread glottis] in 'stock', or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] (or [ʔ] from the earlier example) whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") - (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstractions too much") - (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie "(code "/t/") ", "(code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) - (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") - (code "phoneme = positive-integer * phone { phoneme } ) ; (* a phoneme must be a set of phones and optional (archi-)phoneme *)" (br) - "phone = positive-integer * feature ; (* a phone must be a set of features *)" (br) - "feature = ( value, identifier ) | positive-integer * feature ; (* a feature must be a value with some identifier or a set of (dependent) features *)" (br) - "value = non-negative integer ;" (br) - "identifier = letter, { letter | \"-\" } ; (* lispy identifiers assumed for now *)" (br) - "non-negative-integer = digit , { digit } ; (* from here i'll take for granted the definition of digits and letters *)" (br)) - (p "this grammar is insufficient to the purpose, but i include it to point at the recursive nature of both phonemes and features revealed by the constraints defined so far. an additional constraint must be that features are bound in a global feature system and a featural definition of a phone requires values for every possible feature within that feature system. additionally, a feature value can be any within a bound set where each feature can be associated with a different set; so, [+/- nasal] and [-1/0/1 high] can exist within the same feature system, but any instance of [nasal] must have a value of [+] or [-] and any value of [high] must have [-1], [0], or [1]. the grammar handwaves with non-negative-integer by analogy with enums in many programming languages. this grammar also defines a language that would be repetitive and finicky to work with. instead of optimizing, i'd like to take a moment to consider the phoneme already solved in latl and think a little bit about how they're used")) - ;; 1.2 lexemes - (section - ((id "lexemes")) - (hgroup - (h3 "lexemes") - (p (em "zooming out a little to the fundamental unit of meaning"))) - (p "note! for the purpose of this exploration, a lexeme is assumed to be synonymous with 'root morpheme'." (small " if you don't know what this note means, please be aware that i'm being a little bit of a crank again. if you do know what this note means and are suspicious, run with me here for a sec; we'll get to it")) - (p "for now i'll posit that a lexeme is an ordered sequence of phoneme(s) that corresponds to a productive, atomic meaning. a lexeme MAY be subject to derivation rules which transform its meaning or its role in an utterance, for now called 'derived forms'. this definition allows for any 'part of speach' so long as the lexeme is not derived. taking for granted, for a moment, the category 'word', here's a selection of english words that fit this definition of lexeme: 'a', 'she', 'her', 'for', 'four', 'write', 'right', 'quick', 'quit', 'dirigible', 'abstract'") - (p "included are 'function words' (the closed set of grammatically necessary words without independent meaning) like 'a', 'she', 'her', and 'for'. 'content words' are also included (the open set of words with semantic weight) beginning with 'four'. but of course, i've also chosen these words to illustrate some potential traps. we have some phonetic ambiguities: 'for' and 'four' are distinct in some english dialects, but i pronounce them both /fɔɹ/. 'write' and 'right' are indistinguishable from each other in every english and sound something like /ɹajt/. the situation is tricky in this case semantically as well! this is one sequence of sounds upon which multiple different etymologies (encoding mark-making, correctness, directionality, or politics) have converged. if the written forms are any hint, there should be at least two separate lexemes") - (p "i've also snuck in the pair 'she' and 'her'. traditionally, 'her' is held to be a derived form of 'she' violating our 'root morpheme' assumption. leaving aside the linguistic reasons to consider 'her' a derived form, there's still the question of what plausible derivation rule could turn the sound sequence /ʃi/ into /hɜɹ/? (" (small "the ancestral form of 'her' probably was transparently derived from the ancestral form of 'she', but in this project i'm concerned with how these derivations are obscured by language change through time") ")") - (p "the write/right example and the she/her example, in slightly different ways, both recall the bidirectional nature of language. an idealized speaker *knows* which specific meaning (specific lexeme?!) of /ɹajt/ they are referring to, but their interlocutor must derive the appropriate meaning from context. likewise, a proficient speaker produces /ʃi/ and /hɜɹ/ in the appropriate position within a sentence without difficulty, while a language learner may struggle to hear the connection between the two forms. (other interesting possibilities include using one or the other form in all locations or in random distribution; analogizing the regularity of /hi/->/hɪm/ ('he'/'him') to /ʃi/->/ʃɪm/ where a /hɜɹ/ is expected; or using /hi/, /ʃi/, /ðej/ 'they' or other third person pronouns interchangeably. all of these point at some other juicy stuff that will have to be shelved for now.) this bidirectionality means that latl will need to support the mapping of a sequence of phonemes to an arbitrary number of lexemes, although for now it's safe to assume that a lexeme has only one associated sequence of phonemes. (ignoring, for the moment, variant pronunciations as in 'the' /ði/~/ðə/)") - (p "a lexeme will probably need some additional stuff, tho. at the very least a 'dictionary definition' and, of course, a shorthand, ie " (code "/ʃi/") ", " (code "/hɜɹ/") ", or " (code "/ɹajt/")". there's absolutely more to what latl will require from a lexeme (and users should be able to extend the lexeme primitive to their own ends) but that will have to wait for now") - (p "before moving on")) - ;; 1.3 morphosyntax or morphemes? - (section - ((id "morphosyntax")) - (hgroup - (h3 "morphosyntax") - (p (em "where meaning and phonology and time start getting funky")))) - (p "") - ) + (a ((href "/unsettled/latl-primitives_what-is-language") + (hx-get "/hx/unsettled/latl-primitives_what-is-language") + (hx-target "#what-is-language") + (hx-swap "outerHTML")) + "what-is-language")) ;; section 2. okay but conlangers (section ((id "what-conlangers-do")) (hgroup (h2 "what conlangers do") (p (em "moving from a pile of language stuff to a pile of problems to solve"))) - (p "") - (section - (hgroup - (h3 "what's in a sound change rule?") - (p (em "using previous work as a starting point"))) - "")) + (p "coming soon")) ;; section 3. introducing the primitives (section ((id "proposed-latl-primitives")) (hgroup - (h2 "") - (p (em ""))) - (p "") - (section - ((id "")) - (hgroup - (h3 "") - (p (em ""))) - (p ""))) + (h2 "introducing the primitives") + (p (em "things that definitely need to be present in latl"))) + (p "coming soon")) ;; brief conclusion and next steps (section ((id "signoff")) (hgroup (h2 "signing off") - (p (em "what's next for latl thinking?"))))) + (p (em "what's next for latl thinking?"))) + "coming soon")) diff --git a/in-progress/latl-primitives_proposed-latl-primitives.scm b/in-progress/latl-primitives_proposed-latl-primitives.scm new file mode 100644 index 0000000..7b7f57f --- /dev/null +++ b/in-progress/latl-primitives_proposed-latl-primitives.scm @@ -0,0 +1,12 @@ +(section + ((id "proposed-latl-primitives")) + (hgroup + (h2 "") + (p (em ""))) + (p "") + (section + ((id "")) + (hgroup + (h3 "") + (p (em ""))) + (p ""))) \ No newline at end of file diff --git a/in-progress/latl-primitives_what-conlangers-do.scm b/in-progress/latl-primitives_what-conlangers-do.scm new file mode 100644 index 0000000..b758223 --- /dev/null +++ b/in-progress/latl-primitives_what-conlangers-do.scm @@ -0,0 +1,11 @@ +(section + ((id "what-conlangers-do")) + (hgroup + (h2 "what conlangers do") + (p (em "moving from a pile of language stuff to a pile of problems to solve"))) + (p "") + (section + (hgroup + (h3 "what's in a sound change rule?") + (p (em "using previous work as a starting point"))) + "")) \ No newline at end of file diff --git a/in-progress/latl-primitives_what-is-language.scm b/in-progress/latl-primitives_what-is-language.scm new file mode 100644 index 0000000..cac106b --- /dev/null +++ b/in-progress/latl-primitives_what-is-language.scm @@ -0,0 +1,60 @@ +(section + ((id "what-is-language")) + (hgroup + (h2 "thinking about what language is for a moment")) + (p "by way of an opening query: what does a language need? naturally our base case spoken languages have sounds and our base case signed languages have gestures. for each of these, we have an articulatory mechanism: the vocal tract, or the face and hands and arms; and a perceptual mechanism: the auditory system, or the visual system. the unique thing about language among other forms of communication is how languages use time. it might seem basic, but it's easy to forget that 'my cat scratched the post' and 'the post scratched my cat' mean very different things. and the same sounds in a different sequence can become a smattering of ideas as in 'the my scratched cat post' or even lose meaning all together as in 'cra catsm sde thymst opsh'. languages differ on how they use time--some languages allow more freedom for word order than others, but relationships between articulations through time are essential to all known languages. for now, let's start with those articulatory bits! (more on time and on meaning later)") + ;; 1.1 phonemes + (section + ((id "phonemes")) + (hgroup + (h3 "phonemes") + (p (em "what even are they?"))) + (p "no talk of letters here! no " + (q ((style "font-family: serif; font-style: italic; padding: 1px 2px;")) + "'ghoti' is pronounced 'fish'") + " jokes! instead, let's imagine how to describe the difference in articulation and in reception between 'mine' and 'fine' and 'wine' and 'dine' or between '" + ;; add ASL rhymes + "'. these words rhyme! which (for short words) is a way of saying that most of their sounds are the same, and the similar bits come at the end. " + (footnote "rhyme is a little more complicated than that, encompassing stress patterns") ;; describe ASL rhymes + ;; awkward + "" + "it is uncontroversial to suggest that there is a basic articulatory/perceptual unit in any given modality which, when strung together, produces the basic units of meaning. this basic unit, no matter the modality, is called the 'phoneme'." + (footnote "historically, called a 'chereme' in sign languages") + "in selecting the words i have, i've already hinted at how linguists support the existence of these phonemes. 'dine' and 'fine' together form a 'minimal pair' of words with a different meaning whose difference is found in only one perceptually distinct part of their articulation. because we know from english language usage that 'mine' and 'fine' and 'wine' and 'dine' are distinct words with distinct meaning, we have a clue that there is some phonemic difference between /m/ and /f/ and /w/ and /d/. by collecting more examples of these minimal pairs ('do' and 'moo' and 'wed' and 'dead' and on and on) we can begin to describe the physical sounds associated with each phoneme and how each is articulated.") + (p "human bodies are inexact things--perception is important here! it does us no good to describe an extra-tightly clenched middle finger in a closed hand shape as indicative of a distinct phoneme as it would be unlikely to be perceptible to an interlocutor and so could never disambiguate between two signs. environments are noisy and so articulation is also important! in my dialect of english the word 'put' /pʊt/, in a noisy environment, might be pronounced roughly [pʰʊtʰ]. in casual speach, however this same word is frequently realized as [pʰɵʔ] with the only audible consonant at the end being the glottal closure of 'uh-oh'. the only ghost of the exaggerated realization is typically an inaudible tongue placement behind the alveolar ridge. a speaker recognizes what the phoneme 'could be' with more effort, but typically such effort is unnecessary for understanding. this suggests that there phonemes are not simply sounds or handshapes or mouth movements. something must be underlying the equality of meaning between [pʰʊtʰ] and [pʰɵʔ]") + (p "there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are " (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") + (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. as stated, there's broad agreement that phonetic features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") + (p "users should therefore be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use "(em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") + (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") + (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") ;; TODO add some ASL images (maybe sound for some of the english bits? + (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock', without aspiration [stɑk] [- spread glottis] in 'stock', or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] (or [ʔ] from the earlier example) whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") + (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstractions too much") + (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie "(code "/t/") ", "(code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) + (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") + (code "phoneme = positive-integer * phone { phoneme } ) ; (* a phoneme must be a set of phones and optional (archi-)phoneme *)" (br) + "phone = positive-integer * feature ; (* a phone must be a set of features *)" (br) + "feature = ( value, identifier ) | positive-integer * feature ; (* a feature must be a value with some identifier or a set of (dependent) features *)" (br) + "value = non-negative integer ;" (br) + "identifier = letter, { letter | \"-\" } ; (* lispy identifiers assumed for now *)" (br) + "non-negative-integer = digit , { digit } ; (* from here i'll take for granted the definition of digits and letters *)" (br)) + (p "this grammar is insufficient to the purpose, but i include it to point at the recursive nature of both phonemes and features revealed by the constraints defined so far. an additional constraint must be that features are bound in a global feature system and a featural definition of a phone requires values for every possible feature within that feature system. additionally, a feature value can be any within a bound set where each feature can be associated with a different set; so, [+/- nasal] and [-1/0/1 high] can exist within the same feature system, but any instance of [nasal] must have a value of [+] or [-] and any value of [high] must have [-1], [0], or [1]. the grammar handwaves with non-negative-integer by analogy with enums in many programming languages. this grammar also defines a language that would be repetitive and finicky to work with. instead of optimizing, i'd like to take a moment to consider the phoneme already solved in latl and think a little bit about how they're used")) + ;; 1.2 lexemes + (section + ((id "lexemes")) + (hgroup + (h3 "lexemes") + (p (em "zooming out a little to the fundamental unit of meaning"))) + (p "note! for the purpose of this exploration, a lexeme is assumed to be synonymous with 'root morpheme'." (small " if you don't know what this note means, please be aware that i'm being a little bit of a crank again. if you do know what this note means and are suspicious, run with me here for a sec; we'll get to it")) + (p "for now i'll posit that a lexeme is an ordered sequence of phoneme(s) that corresponds to a productive, atomic meaning. a lexeme MAY be subject to derivation rules which transform its meaning or its role in an utterance, for now called 'derived forms'. this definition allows for any 'part of speach' so long as the lexeme is not derived. taking for granted, for a moment, the category 'word', here's a selection of english words that fit this definition of lexeme: 'a', 'she', 'her', 'for', 'four', 'write', 'right', 'quick', 'quit', 'dirigible', 'abstract'") + (p "included are 'function words' (the closed set of grammatically necessary words without independent meaning) like 'a', 'she', 'her', and 'for'. 'content words' are also included (the open set of words with semantic weight) beginning with 'four'. but of course, i've also chosen these words to illustrate some potential traps. we have some phonetic ambiguities: 'for' and 'four' are distinct in some english dialects, but i pronounce them both /fɔɹ/. 'write' and 'right' are indistinguishable from each other in every english and sound something like /ɹajt/. the situation is tricky in this case semantically as well! this is one sequence of sounds upon which multiple different etymologies (encoding mark-making, correctness, directionality, or politics) have converged. if the written forms are any hint, there should be at least two separate lexemes") + (p "i've also snuck in the pair 'she' and 'her'. traditionally, 'her' is held to be a derived form of 'she' violating our 'root morpheme' assumption. leaving aside the linguistic reasons to consider 'her' a derived form, there's still the question of what plausible derivation rule could turn the sound sequence /ʃi/ into /hɜɹ/? (" (small "the ancestral form of 'her' probably was transparently derived from the ancestral form of 'she', but in this project i'm concerned with how these derivations are obscured by language change through time") ")") + (p "the write/right example and the she/her example, in slightly different ways, both recall the bidirectional nature of language. an idealized speaker *knows* which specific meaning (specific lexeme?!) of /ɹajt/ they are referring to, but their interlocutor must derive the appropriate meaning from context. likewise, a proficient speaker produces /ʃi/ and /hɜɹ/ in the appropriate position within a sentence without difficulty, while a language learner may struggle to hear the connection between the two forms. (other interesting possibilities include using one or the other form in all locations or in random distribution; analogizing the regularity of /hi/->/hɪm/ ('he'/'him') to /ʃi/->/ʃɪm/ where a /hɜɹ/ is expected; or using /hi/, /ʃi/, /ðej/ 'they' or other third person pronouns interchangeably. all of these point at some other juicy stuff that will have to be shelved for now.) this bidirectionality means that latl will need to support the mapping of a sequence of phonemes to an arbitrary number of lexemes, although for now it's safe to assume that a lexeme has only one associated sequence of phonemes. (ignoring, for the moment, variant pronunciations as in 'the' /ði/~/ðə/)") + (p "a lexeme will probably need some additional stuff, tho. at the very least a 'dictionary definition' and, of course, a shorthand, ie " (code "/ʃi/") ", " (code "/hɜɹ/") ", or " (code "/ɹajt/")". there's absolutely more to what latl will require from a lexeme (and users should be able to extend the lexeme primitive to their own ends) but that will have to wait for now") + (p "before moving on")) + ;; 1.3 morphosyntax or morphemes? + (section + ((id "morphosyntax")) + (hgroup + (h3 "morphosyntax") + (p (em "where meaning and phonology and time start getting funky")))) + (p "")) \ No newline at end of file From 49261be7ef308a297f79033ee260cbb0aced7e0e Mon Sep 17 00:00:00 2001 From: sorrel Date: Sun, 25 Feb 2024 21:37:55 -0500 Subject: [PATCH 16/16] publish beginning of latl-primitives --- {in-progress => archive}/latl-primitives.scm | 0 .../latl-primitives_what-is-language.scm | 0 data/atom.csv | 2 ++ data/tagged.csv | 9 +++++---- data/unsettled.csv | 2 ++ source/feed.atom | 2 +- source/tagged/conlang.scm | 2 +- source/tagged/index.scm | 2 +- source/tagged/latl.scm | 2 +- source/tagged/linguistics.scm | 1 + source/tagged/programming-language.scm | 2 +- source/unsettled/index.scm | 2 +- source/unsettled/latl-primitives.scm | 1 + source/unsettled/latl-primitives_what-is-language.scm | 1 + 14 files changed, 18 insertions(+), 10 deletions(-) rename {in-progress => archive}/latl-primitives.scm (100%) rename {in-progress => archive}/latl-primitives_what-is-language.scm (100%) create mode 100644 source/tagged/linguistics.scm create mode 100644 source/unsettled/latl-primitives.scm create mode 100644 source/unsettled/latl-primitives_what-is-language.scm diff --git a/in-progress/latl-primitives.scm b/archive/latl-primitives.scm similarity index 100% rename from in-progress/latl-primitives.scm rename to archive/latl-primitives.scm diff --git a/in-progress/latl-primitives_what-is-language.scm b/archive/latl-primitives_what-is-language.scm similarity index 100% rename from in-progress/latl-primitives_what-is-language.scm rename to archive/latl-primitives_what-is-language.scm diff --git a/data/atom.csv b/data/atom.csv index 8aa6e33..4b6fd11 100644 --- a/data/atom.csv +++ b/data/atom.csv @@ -1,4 +1,6 @@ title,link,summary,published,updated +latl-primitives_what-is-language,https://oxaliq.net/unsettled/latl-primitives_what-is-language,thinking about language from the perspective of latl,2024-02-25T21:36:03, +latl-primitives,https://oxaliq.net/unsettled/latl-primitives,designing the primitives to be provided by latl,2024-02-25T21:33:06, feature-change-applier,https://oxaliq.net/settled/1,a first attempt at a conlanging tool,2024-01-25T16:26:10, beginning latl,https://oxaliq.net/unsettled/1,beginning the process of thinking through an environment for conlanging and other language shenanigans,2024-01-18T22:39:00, now,https://oxaliq.net/now,what the author of this site is up to (not computer things),2024-01-18T22:22:03, diff --git a/data/tagged.csv b/data/tagged.csv index b8ba424..9541674 100644 --- a/data/tagged.csv +++ b/data/tagged.csv @@ -1,6 +1,7 @@ tags,-> about,root/now,root/contact,root/very-earnest-disclaimer,root/this,root/about -latl,unsettled/1 -conlang,settled/1,unsettled/1 -programming-language,unsettled/1 -tool,settled/1 \ No newline at end of file +latl,unsettled/latl-primitives_what-is-language,unsettled/latl-primitives,unsettled/1 +conlang,unsettled/latl-primitives,settled/1,unsettled/1 +programming-language,unsettled/latl-primitives,unsettled/1 +tool,settled/1 +linguistics,unsettled/latl-primitives_what-is-language \ No newline at end of file diff --git a/data/unsettled.csv b/data/unsettled.csv index f9f3b64..67bcf63 100644 --- a/data/unsettled.csv +++ b/data/unsettled.csv @@ -1,2 +1,4 @@ id,headline,description,history-> +latl-primitives_what-is-language,latl-primitives_what-is-language,thinking about language from the perspective of latl,2024-02-25T21:36:03 +latl-primitives,latl-primitives,designing the primitives to be provided by latl,2024-02-25T21:33:06 1,beginning latl,beginning the process of thinking through an environment for conlanging and other language shenanigans,2024-01-18T22:39:00 \ No newline at end of file diff --git a/source/feed.atom b/source/feed.atom index 1de0b70..59bf915 100644 --- a/source/feed.atom +++ b/source/feed.atom @@ -1 +1 @@ -λ.oxaliq.net2024-01-25T16:26:10sorrelhttps://oxaliq.netfeature-change-applierhttps://oxaliq.net/settled/1a first attempt at a conlanging tool2024-01-25T16:26:10beginning latlhttps://oxaliq.net/unsettled/1beginning the process of thinking through an environment for conlanging and other language shenanigans2024-01-18T22:39:00nowhttps://oxaliq.net/nowwhat the author of this site is up to (not computer things)2024-01-18T22:22:03contacthttps://oxaliq.net/contacthow to talk to me2024-01-18T22:21:26very earnest disclaimerhttps://oxaliq.net/very-earnest-disclaimerbeing earnest in the streets2024-01-18T22:20:50thishttps://oxaliq.net/thisthe site this bitch made2024-01-18T22:19:43abouthttps://oxaliq.net/aboutabout the bitch who made this site2024-01-18T21:56:45 \ No newline at end of file +λ.oxaliq.net2024-02-25T21:36:03sorrelhttps://oxaliq.netlatl-primitives_what-is-languagehttps://oxaliq.net/unsettled/latl-primitives_what-is-languagethinking about language from the perspective of latl2024-02-25T21:36:03latl-primitiveshttps://oxaliq.net/unsettled/latl-primitivesdesigning the primitives to be provided by latl2024-02-25T21:33:06feature-change-applierhttps://oxaliq.net/settled/1a first attempt at a conlanging tool2024-01-25T16:26:10beginning latlhttps://oxaliq.net/unsettled/1beginning the process of thinking through an environment for conlanging and other language shenanigans2024-01-18T22:39:00nowhttps://oxaliq.net/nowwhat the author of this site is up to (not computer things)2024-01-18T22:22:03contacthttps://oxaliq.net/contacthow to talk to me2024-01-18T22:21:26very earnest disclaimerhttps://oxaliq.net/very-earnest-disclaimerbeing earnest in the streets2024-01-18T22:20:50thishttps://oxaliq.net/thisthe site this bitch made2024-01-18T22:19:43abouthttps://oxaliq.net/aboutabout the bitch who made this site2024-01-18T21:56:45 \ No newline at end of file diff --git a/source/tagged/conlang.scm b/source/tagged/conlang.scm index 06f6378..76d620b 100644 --- a/source/tagged/conlang.scm +++ b/source/tagged/conlang.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#conlang")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#conlang")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "/settled/1")) "go! to feature-change-applier page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#conlang")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#conlang")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "latl-primitives") (p "designing the primitives to be provided by latl") (a ((href "/latl-primitives")) "go! to latl-primitives page")) (div ((class "post-preview")) (h4 "feature-change-applier") (p "a first attempt at a conlanging tool") (a ((href "/1")) "go! to feature-change-applier page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/tagged/index.scm b/source/tagged/index.scm index 9a463d1..efd16d7 100644 --- a/source/tagged/index.scm +++ b/source/tagged/index.scm @@ -1 +1 @@ -'(article (hgroup (h1 "all the tags") (p (em "a categorical mess for your perusal"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "about") (p "posts about about") (a ((href "/tagged/about")) "go! to about page")) (div ((class "post-preview")) (h4 "latl") (p "posts about latl") (a ((href "/tagged/latl")) "go! to latl page")) (div ((class "post-preview")) (h4 "conlang") (p "posts about conlang") (a ((href "/tagged/conlang")) "go! to conlang page")) (div ((class "post-preview")) (h4 "programming-language") (p "posts about programming-language") (a ((href "/tagged/programming-language")) "go! to programming-language page")) (div ((class "post-preview")) (h4 "tool") (p "posts about tool") (a ((href "/tagged/tool")) "go! to tool page"))) \ No newline at end of file +'(article (hgroup (h1 "all the tags") (p (em "a categorical mess for your perusal"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "about") (p "posts about about") (a ((href "/tagged/about")) "go! to about page")) (div ((class "post-preview")) (h4 "latl") (p "posts about latl") (a ((href "/tagged/latl")) "go! to latl page")) (div ((class "post-preview")) (h4 "conlang") (p "posts about conlang") (a ((href "/tagged/conlang")) "go! to conlang page")) (div ((class "post-preview")) (h4 "programming-language") (p "posts about programming-language") (a ((href "/tagged/programming-language")) "go! to programming-language page")) (div ((class "post-preview")) (h4 "tool") (p "posts about tool") (a ((href "/tagged/tool")) "go! to tool page")) (div ((class "post-preview")) (h4 "linguistics") (p "posts about linguistics") (a ((href "/tagged/linguistics")) "go! to linguistics page"))) \ No newline at end of file diff --git a/source/tagged/latl.scm b/source/tagged/latl.scm index 6fa3c1d..e52dcf3 100644 --- a/source/tagged/latl.scm +++ b/source/tagged/latl.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#latl")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#latl")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#latl")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#latl")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "latl-primitives_what-is-language") (p "thinking about language from the perspective of latl") (a ((href "/latl-primitives_what-is-language")) "go! to latl-primitives_what-is-language page")) (div ((class "post-preview")) (h4 "latl-primitives") (p "designing the primitives to be provided by latl") (a ((href "/latl-primitives")) "go! to latl-primitives page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/tagged/linguistics.scm b/source/tagged/linguistics.scm new file mode 100644 index 0000000..0d02ac2 --- /dev/null +++ b/source/tagged/linguistics.scm @@ -0,0 +1 @@ +'(article (hgroup (h1 "stuff what's tagged like " (em "#linguistics")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#linguistics")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "latl-primitives_what-is-language") (p "thinking about language from the perspective of latl") (a ((href "/latl-primitives_what-is-language")) "go! to latl-primitives_what-is-language page"))) \ No newline at end of file diff --git a/source/tagged/programming-language.scm b/source/tagged/programming-language.scm index 3b8b9a9..79ee53c 100644 --- a/source/tagged/programming-language.scm +++ b/source/tagged/programming-language.scm @@ -1 +1 @@ -'(article (hgroup (h1 "stuff what's tagged like " (em "#programming-language")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#programming-language")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "stuff what's tagged like " (em "#programming-language")) (p (em "everything (or maybe just some things) i've ever said about " (strong "#programming-language")))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "latl-primitives") (p "designing the primitives to be provided by latl") (a ((href "/latl-primitives")) "go! to latl-primitives page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/unsettled/index.scm b/source/unsettled/index.scm index 89c0e15..3c6ed26 100644 --- a/source/unsettled/index.scm +++ b/source/unsettled/index.scm @@ -1 +1 @@ -'(article (hgroup (h1 "unsettled thoughts") (p (em "just doing some thinking aloud"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file +'(article (hgroup (h1 "unsettled thoughts") (p (em "just doing some thinking aloud"))) (h3 "the thoughts") (div ((class "post-preview")) (h4 "latl-primitives_what-is-language") (p "thinking about language from the perspective of latl") (a ((href "/unsettled/latl-primitives_what-is-language")) "go! to latl-primitives_what-is-language page")) (div ((class "post-preview")) (h4 "latl-primitives") (p "designing the primitives to be provided by latl") (a ((href "/unsettled/latl-primitives")) "go! to latl-primitives page")) (div ((class "post-preview")) (h4 "beginning latl") (p "beginning the process of thinking through an environment for conlanging and other language shenanigans") (a ((href "/unsettled/1")) "go! to beginning latl page"))) \ No newline at end of file diff --git a/source/unsettled/latl-primitives.scm b/source/unsettled/latl-primitives.scm new file mode 100644 index 0000000..c11e3f1 --- /dev/null +++ b/source/unsettled/latl-primitives.scm @@ -0,0 +1 @@ +'(body '(article ((id "latl-primitives")) (section ((id "intro")) (hgroup (h1 "what must be true of latl primitives") (p (em "what will latl need to " (u "do") " out of the box?"))) (p "i've talked a little about " (a ((href "/unsettled/1")) "conlanging and latl") " previously here. the short version is this: making languages (for theoretical conscious beings) is fun! it's been a consistent hobby and artistic pursuit for me for much of my life. i've had different approaches from making extremely regular languages, to simulating the evolution of a family of spoken languages, to a family of synthesizer languages for a fractured machine society. every language project requires keeping track of a dictionary and a grammar (even if they never become more than quick sketches) and any sufficiently involved project can benefit from tools for generating new words that fit a language's 'phonotactics', generating derived words based on grammatical rules, simulating language change over time. conlanging is a hobby with enough overlap with computation, that some conlangers have created tools for some of these tasks. my own projects have become too ambitious to have my work live in spreadsheets over here and latex files over there and text files with the defintions i provide to web-based tools somewhere else entirely. i want to build on the work of those came before and create a substrate upon which any tool a conlanger needs could be built and in which i can define the entirety of a language in one system.") (p "at it's base latl will be a tool for operating on languages, invented (or otherwise... maybe.) it helps then to think of the sorts of things that encompass language. spoken and signed languages will be the assumed base case, as those are the things real human beings usually use to communicate with each other. the modality of a language needn't be important to the primitives used, but it's always a good practice to state assumptions")) (section ((id "contents")) (ul (li (a ((href "#what-is-language")) "go to what-is-language")) (li (a ((href "#what-conlangers-do")) "go to what-conlangers-do")) (li (a ((href "#proposed-latl-primitives")) "go to proposed-latl-primitives")) (li (a ((href "#signoff")) "go to signoff")))) (section ((id "what-is-language")) (hgroup (h2 "thinking about what language is for a moment")) (a ((href "/unsettled/latl-primitives_what-is-language") (hx-get "/hx/unsettled/latl-primitives_what-is-language") (hx-target "#what-is-language") (hx-swap "outerHTML")) "what-is-language")) (section ((id "what-conlangers-do")) (hgroup (h2 "what conlangers do") (p (em "moving from a pile of language stuff to a pile of problems to solve"))) (p "coming soon")) (section ((id "proposed-latl-primitives")) (hgroup (h2 "introducing the primitives") (p (em "things that definitely need to be present in latl"))) (p "coming soon")) (section ((id "signoff")) (hgroup (h2 "signing off") (p (em "what's next for latl thinking?"))) "coming soon")) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/unsettledlatl-primitives.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/latl") (hx-get "/hx/tagged/latl") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "latl"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/conlang") (hx-get "/hx/tagged/conlang") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "conlang"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/programming-language") (hx-get "/hx/tagged/programming-language") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "programming-language"))))) (hr) (p ((class "doc-history")) (small "published: 2024-02-25T21:33:06")) (p ((class "license-info")) (small (a ((href "static/license/license.txt")) "license"))))) \ No newline at end of file diff --git a/source/unsettled/latl-primitives_what-is-language.scm b/source/unsettled/latl-primitives_what-is-language.scm new file mode 100644 index 0000000..c7c2ad2 --- /dev/null +++ b/source/unsettled/latl-primitives_what-is-language.scm @@ -0,0 +1 @@ +'(body (section ((id "what-is-language")) (hgroup (h2 "thinking about what language is for a moment")) (p "by way of an opening query: what does a language need? naturally our base case spoken languages have sounds and our base case signed languages have gestures. for each of these, we have an articulatory mechanism: the vocal tract, or the face and hands and arms; and a perceptual mechanism: the auditory system, or the visual system. the unique thing about language among other forms of communication is how languages use time. it might seem basic, but it's easy to forget that 'my cat scratched the post' and 'the post scratched my cat' mean very different things. and the same sounds in a different sequence can become a smattering of ideas as in 'the my scratched cat post' or even lose meaning all together as in 'cra catsm sde thymst opsh'. languages differ on how they use time--some languages allow more freedom for word order than others, but relationships between articulations through time are essential to all known languages. for now, let's start with those articulatory bits! (more on time and on meaning later)") (section ((id "phonemes")) (hgroup (h3 "phonemes") (p (em "what even are they?"))) (p "no talk of letters here! no " (q ((style "font-family: serif; font-style: italic; padding: 1px 2px;")) "'ghoti' is pronounced 'fish'") " jokes! instead, let's imagine how to describe the difference in articulation and in reception between 'mine' and 'fine' and 'wine' and 'dine' or between '" "'. these words rhyme! which (for short words) is a way of saying that most of their sounds are the same, and the similar bits come at the end. " (footnote "rhyme is a little more complicated than that, encompassing stress patterns") "" "it is uncontroversial to suggest that there is a basic articulatory/perceptual unit in any given modality which, when strung together, produces the basic units of meaning. this basic unit, no matter the modality, is called the 'phoneme'." (footnote "historically, called a 'chereme' in sign languages") "in selecting the words i have, i've already hinted at how linguists support the existence of these phonemes. 'dine' and 'fine' together form a 'minimal pair' of words with a different meaning whose difference is found in only one perceptually distinct part of their articulation. because we know from english language usage that 'mine' and 'fine' and 'wine' and 'dine' are distinct words with distinct meaning, we have a clue that there is some phonemic difference between /m/ and /f/ and /w/ and /d/. by collecting more examples of these minimal pairs ('do' and 'moo' and 'wed' and 'dead' and on and on) we can begin to describe the physical sounds associated with each phoneme and how each is articulated.") (p "human bodies are inexact things--perception is important here! it does us no good to describe an extra-tightly clenched middle finger in a closed hand shape as indicative of a distinct phoneme as it would be unlikely to be perceptible to an interlocutor and so could never disambiguate between two signs. environments are noisy and so articulation is also important! in my dialect of english the word 'put' /pʊt/, in a noisy environment, might be pronounced roughly [pʰʊtʰ]. in casual speach, however this same word is frequently realized as [pʰɵʔ] with the only audible consonant at the end being the glottal closure of 'uh-oh'. the only ghost of the exaggerated realization is typically an inaudible tongue placement behind the alveolar ridge. a speaker recognizes what the phoneme 'could be' with more effort, but typically such effort is unnecessary for understanding. this suggests that there phonemes are not simply sounds or handshapes or mouth movements. something must be underlying the equality of meaning between [pʰʊtʰ] and [pʰɵʔ]") (p "there's a fairly wide consensus amongst linguists that, despite being the minimal constituent needed to represent meaning in language, phonemes are " (strong "not atomic.") " a phoneme can be decomposed into constituent features and minimal pairs of phonemes can be shown to be distinct only in their realization of one feature. by way of example, the [b] in the word 'shabby' and the [m] in the word 'shammy' differ only in that the [m] is pronounced with air passing through the nasal cavity. the feature [+/- nasal] is therefore taken to be a salient feature in english phonology") (p "all well and good, but things start to get tricky when we start defining features. firstly, there is no single agreed upon set of features by which to analyze all languages of a given modality. as stated, there's broad agreement that phonetic features exist and many proposed features are uncontroversial, yet even linguists analyzing the same language can disagree upon featural details. vowels in particular are quite slippery to analyze, with [+/- back], [+/- close], [+/- front], [+/- low], [+/- high], [+/- tongue root retracted], [+/- rounded] among the features present in different systems. there are also some linguists who, relying on auditory analysis, analyze vowels primarily via formant analysis. (formants are measures of what is sometimes referred to as 'resonance' or 'vowel color' -- they are the pitches above the fundamental frequency with the greatest relative amplitude.) it is this amateur crank's opinion that because articulation and perception are subject to different constraints and pressures, what is deemed a feature can elide a relationship between speach actor and interlocutor. thankfully, should latl allow for user definition of features and their phonemes, it can remain agnostic to the hairy work of actual linguistics") (p "users should therefore be able to define their own phonetic feature sets and use those to compose their phonemes. (i'm going to sneak in the undefended assertion here that users should be able to use " (em "other users'") " definitions as well. forgive me.) if you're reading this and are familiar with linguistics, you might now be wondering about the curious case of place of articulation. should place features be treated as hierarchichal -- should [coronal] place of articulation be required for [+/- anterior] feature of the crown of the tongue? if so, how are coarticulations like [tʷ] or [k͡p] to be expressed in featural terms? here again, latl will allow for the definition of hierarchichal features and make no assumptions about their use") (p "yet another problem is hiding in the view i've thus provided of phonological features. there is a wide (but not universal) belief that distinctive features in phonology are inherently binary. this is convenient from a computational perspective, but may not be descriptive of real language. firstly, it is possible to analyze [coronal] in the previous paragraph as a unary feature relevant to place of articulation. more distressingly, a proposed feature set that includes [+/- high] and [+/- low] predicts the nonsense value set: {[+ high] [+ low]}. one approach to this conundrum is to propose a feature scale [-1/0/1 height]. this is far from a settled matter, but latl should prioritize a user's ability to define such feature scales over implementation considerations or linguistic debate") (p "it's been a few paragraphs without any mention of sign languages, so it is worth gesturing at how their phonological features relate to these considerations to ensure latl doesn't start it's life with a modality bias. sign languages are widely understood to have phonological systems that are featural. as is the case with spoken languages, specifics of feature sets vary based on language and researcher. features can be salient to a language and form minimal pairs ie [+/- palm prone] is one way of reading the difference between the ASL fingerspelling signs for /p/ and /k/. research suggests that there is a high degree of hierarchichal complexity in the phonological features of sign languages, which maps very neatly to the place of articulation problem in spoken languages. features related to handshape, such as [+/- flex] or [+/- extension] only make sense in regards to selected fingers. i have not seen any research about featural scales in sign languages, but it would be unsurprising to analogize the same issues arising from nonsense combinations of binary features") (p "let's zoom back out to phonemes for a moment to add another wrinkle to the featural representation. the notion (unconscious or not) a speaker of a language has for what constitutes a single sound is understood to be a 'bundle' of features, but not every feature holds the same importance in every environment. by way of example, the /t/ phoneme in my dialect of english can be realized in a number of different ways depending on its location. it can be aspirated [tʰɑk] with [+ spread glottis] (or [+ delayed onset] if you prefer an auditory approach) in 'tock', without aspiration [stɑk] [- spread glottis] in 'stock', or as a flap [ˈbʌ.ɾək] in 'buttock'. this flap differs from the others at least in having [+ sonorant] and [+ voice], but retaining [coronal] [+ anterior]. yet, if i heard *[ɾɑk] in isolation, i would assume the speaker was referring to a stone or a genre of music. this situation is called allophony and latl must maintain a way to treat phonemes like /t/ as salient bundles of features distinct from the more discrete phones [tʰ], [t], [ɾ] (or [ʔ] from the earlier example) whose features are more specified. once again, we see a similar situation with regards the ASL phoneme, /e handshape/ which has allophonic representations [+ open aperture] (the unmarked /e/ familiar in the fingerspelled alphabet) and [- open aperture] in certain environments") (p "warning! that [r] in my dialect of english, is an allophone of two different phonemes! the realization of the words /bæt.ər/ and /bæd.ər/ ('batter' and 'badder') is the same: [bæɾ.ɚ]. this 'under-specification' of not unique to my dialect of english and some linguists propose an archiphoneme /D/ which is a kind of set of /t/ and /d/ to account for this. in this view 'batter' and 'badder' are orthographically distinct, but phonemically both /bæD.ər/. is this 'really' what is going on? i'm not qualified to say, but i am confident that latl can be made to handle this situation without straining our abstractions too much") (p "to recap thus far, we have phonemes, which for the purpose of latl are bundles of features of some value. features may be defined by the user of latl into feature systems, whereby they are usually but not always binary and may each have a dependency on another feature in the system. phonemes may have features of varying saliency allowing for allophony. these allophones are phones whose features are slightly different but retain the salient features of their phoneme, whether that phoneme is specified or an underspecified archiphoneme that could represent multiple phonemes. as an additional item, it is helpful to have a shorthand to refer to phonemes and their allophones, ie " (code "/t/") ", " (code "[tʰ]") ", " (code "[t]") ", and " (code "[ɾ]") " or " (code "/D/")) (p "an EBNF grammar (because grammars are fun!) of this relationship might be ") (code "phoneme = positive-integer * phone { phoneme } ) ; (* a phoneme must be a set of phones and optional (archi-)phoneme *)" (br) "phone = positive-integer * feature ; (* a phone must be a set of features *)" (br) "feature = ( value, identifier ) | positive-integer * feature ; (* a feature must be a value with some identifier or a set of (dependent) features *)" (br) "value = non-negative integer ;" (br) "identifier = letter, { letter | \"-\" } ; (* lispy identifiers assumed for now *)" (br) "non-negative-integer = digit , { digit } ; (* from here i'll take for granted the definition of digits and letters *)" (br)) (p "this grammar is insufficient to the purpose, but i include it to point at the recursive nature of both phonemes and features revealed by the constraints defined so far. an additional constraint must be that features are bound in a global feature system and a featural definition of a phone requires values for every possible feature within that feature system. additionally, a feature value can be any within a bound set where each feature can be associated with a different set; so, [+/- nasal] and [-1/0/1 high] can exist within the same feature system, but any instance of [nasal] must have a value of [+] or [-] and any value of [high] must have [-1], [0], or [1]. the grammar handwaves with non-negative-integer by analogy with enums in many programming languages. this grammar also defines a language that would be repetitive and finicky to work with. instead of optimizing, i'd like to take a moment to consider the phoneme already solved in latl and think a little bit about how they're used")) (section ((id "lexemes")) (hgroup (h3 "lexemes") (p (em "zooming out a little to the fundamental unit of meaning"))) (p "note! for the purpose of this exploration, a lexeme is assumed to be synonymous with 'root morpheme'." (small " if you don't know what this note means, please be aware that i'm being a little bit of a crank again. if you do know what this note means and are suspicious, run with me here for a sec; we'll get to it")) (p "for now i'll posit that a lexeme is an ordered sequence of phoneme(s) that corresponds to a productive, atomic meaning. a lexeme MAY be subject to derivation rules which transform its meaning or its role in an utterance, for now called 'derived forms'. this definition allows for any 'part of speach' so long as the lexeme is not derived. taking for granted, for a moment, the category 'word', here's a selection of english words that fit this definition of lexeme: 'a', 'she', 'her', 'for', 'four', 'write', 'right', 'quick', 'quit', 'dirigible', 'abstract'") (p "included are 'function words' (the closed set of grammatically necessary words without independent meaning) like 'a', 'she', 'her', and 'for'. 'content words' are also included (the open set of words with semantic weight) beginning with 'four'. but of course, i've also chosen these words to illustrate some potential traps. we have some phonetic ambiguities: 'for' and 'four' are distinct in some english dialects, but i pronounce them both /fɔɹ/. 'write' and 'right' are indistinguishable from each other in every english and sound something like /ɹajt/. the situation is tricky in this case semantically as well! this is one sequence of sounds upon which multiple different etymologies (encoding mark-making, correctness, directionality, or politics) have converged. if the written forms are any hint, there should be at least two separate lexemes") (p "i've also snuck in the pair 'she' and 'her'. traditionally, 'her' is held to be a derived form of 'she' violating our 'root morpheme' assumption. leaving aside the linguistic reasons to consider 'her' a derived form, there's still the question of what plausible derivation rule could turn the sound sequence /ʃi/ into /hɜɹ/? (" (small "the ancestral form of 'her' probably was transparently derived from the ancestral form of 'she', but in this project i'm concerned with how these derivations are obscured by language change through time") ")") (p "the write/right example and the she/her example, in slightly different ways, both recall the bidirectional nature of language. an idealized speaker *knows* which specific meaning (specific lexeme?!) of /ɹajt/ they are referring to, but their interlocutor must derive the appropriate meaning from context. likewise, a proficient speaker produces /ʃi/ and /hɜɹ/ in the appropriate position within a sentence without difficulty, while a language learner may struggle to hear the connection between the two forms. (other interesting possibilities include using one or the other form in all locations or in random distribution; analogizing the regularity of /hi/->/hɪm/ ('he'/'him') to /ʃi/->/ʃɪm/ where a /hɜɹ/ is expected; or using /hi/, /ʃi/, /ðej/ 'they' or other third person pronouns interchangeably. all of these point at some other juicy stuff that will have to be shelved for now.) this bidirectionality means that latl will need to support the mapping of a sequence of phonemes to an arbitrary number of lexemes, although for now it's safe to assume that a lexeme has only one associated sequence of phonemes. (ignoring, for the moment, variant pronunciations as in 'the' /ði/~/ðə/)") (p "a lexeme will probably need some additional stuff, tho. at the very least a 'dictionary definition' and, of course, a shorthand, ie " (code "/ʃi/") ", " (code "/hɜɹ/") ", or " (code "/ɹajt/") ". there's absolutely more to what latl will require from a lexeme (and users should be able to extend the lexeme primitive to their own ends) but that will have to wait for now") (p "before moving on")) (section ((id "morphosyntax")) (hgroup (h3 "morphosyntax") (p (em "where meaning and phonology and time start getting funky")))) (p "")) (footer (a ((href "https://git.bunk.computer/oxaliq/oxaliq.net/src/branch/main/source/unsettledlatl-primitives_what-is-language.scm")) "view source") (hr) (section (h5 "tagged") (ul ((class "tag-list")) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/latl") (hx-get "/hx/tagged/latl") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "latl"))) (li ((class "tag-item")) (span ((class "hx-target")) (a ((href "/tagged/linguistics") (hx-get "/hx/tagged/linguistics") (hx-target "closest span.hx-target") (hx-swap "innerHTML")) "linguistics"))))) (hr) (p ((class "doc-history")) (small "published: 2024-02-25T21:36:03")) (p ((class "license-info")) (small (a ((href "static/license/license.txt")) "license"))))) \ No newline at end of file