frazaro-core 0.10.1

The Frazaro language, host-free: sentences in, spreadsheets out
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
; GENERATED by tools/export_messages.ps1 from src/VLA_Messages.bas - do not hand-edit or lint; the VBA is the source (PORT.5).
; (message <id> <error-number> "<Err.Source>" "<template>"), in the order the VBA registers them.
; The core's half (PORT.12): every family but the language's six (vla, interp, lint, view, calc, grid), which vla-lang/data/messages.vla holds.
(message ide-no-workbook 5 "VLA-IDE" "Open a workbook first")
(message ide-program-name-too-long 5 "VLA-IDE" "That name is too long for a sheet tab - up to 20 characters, please")
(message ide-sheet-name-bad-char 5 "VLA-IDE" "Sheet names cannot contain {char} - pick a name without it")
(message ide-program-name-too-similar 5 "VLA-IDE" "'{new}' is too similar to the existing program '{existing}' (both shorten to '{tag}') - pick a more different name")
(message ide-compile-needs-windows 5 "VLA-IDE" "Compiling needs Windows Excel for now: compiling a program generates VBA into the workbook, and Mac Excel does not allow that kind of access. Check Instructions works here - write and check on Mac, or use Interpret Instructions, which needs no VBA access at all.")
(message ide-compile-needs-trust 5 "VLA-IDE" "Compiling instructions needs \"Trust access to the VBA project object model\" (File > Options > Trust Center > Trust Center Settings > Macro Settings), which this Excel does not currently grant - use Interpret Instructions instead; it runs the same program without needing that access.")
(message ide-export-needs-trust 5 "VLA-IDE" "Exporting needs \"Trust access to the VBA project object model\" (File > Options > Trust Center > Trust Center Settings > Macro Settings), which this Excel does not currently grant.")
(message ide-lint-folder-needs-windows 5 "VLA-IDE" "Linting a whole folder needs Windows Excel's folder-picker dialog, which Mac Excel does not provide - use Lint VLA on one file at a time instead; it works the same on both.")
(message ide-lint-generated-file 5 "VLA-IDE" "{path} is a generated file - its first line says so - and Lint VLA never rewrites one: any change would be lost the next time it is re-made. Change the file it was made from, then make this one again - its first line says how.")
(message ide-lint-not-utf8 5 "VLA-IDE" "{path} is not saved as UTF-8 - byte {offset}, on line {line}, is not valid UTF-8 - so Lint VLA has not changed it: rewriting it would change characters it cannot read. Open it in a text editor, save it with UTF-8 encoding, and lint it again.")
(message ide-lint-unreadable-vla 5 "VLA-IDE" "Lint VLA could not read {path} as VLA, so it has not changed it: {reason}")
(message ide-lint-would-change-text 5 "VLA-IDE" "Lint VLA has not changed {path}: reformatting it would change more than spaces and line breaks, starting on line {line}: {text} - Lint VLA drops a ; comment written inside a form's parentheses, and doubles a lone \\ inside a quoted string. Move that comment onto its own line outside the form, or write the backslash as \\\\, then lint again.")
(message ide-lint-file-changed 5 "VLA-IDE" "{path} changed while Lint VLA was working on it - another program or window saved it - so Lint VLA has not rewritten it. Lint it again to format the new version.")
(message ide-lint-write-not-verified 5 "VLA-IDE" "Lint VLA has not changed {path}: the reformatted copy it wrote beside it did not read back byte for byte, so that copy was deleted. Check that the disk has space, then lint it again.")
(message ide-lint-cannot-replace 5 "VLA-IDE" "Lint VLA could not replace {path} - it may be read-only or open in another program - so the file has not been changed. Close whatever has it open, or clear its read-only setting, and lint it again.")
(message ide-vocab-not-found 53 "VLA-IDE" "Frazaro could not find its phrasebook: it looked for {path}, and this copy of Frazaro carries no built-in one either, so it cannot read any sentence. Reinstall Frazaro to put its phrasebook back.")
(message ide-no-workspace-sheet 5 "VLA-IDE" "No '{sheet}' sheet yet - run Set Up Workspace first")
(message ide-workspace-ambiguous 5 "VLA-IDE" "This workbook has {count} programs ({names}) - go to the program's own sheet and use its buttons")
(message ide-programs-share-short-name 5 "VLA-IDE" "The programs '{a}' and '{b}' would share the short name '{tag}' - rename one of them so each program keeps its own module and its own Undo")
(message ide-autoload-no-slot 5 "VLA-IDE" "Could not register for auto-load - no free OPEN slot found in 50 tries ({key}).")
(message ide-program-file-moved 53 "VLA-IDE" "The program file has moved: {path} - use Import to pick it again")
(message ide-word-read-failed 5 "VLA-IDE" "Word could not open {file}: {detail} - the program on this sheet has not been changed.")
(message ide-word-not-available 5 "VLA-IDE" "Frazaro reads Word documents through Microsoft Word, and could not start it on this computer: {detail}. Save the procedure as plain text (.txt) and load that instead - a text file needs nothing extra. The program on this sheet has not been changed.")
(message ide-word-needs-windows 5 "VLA-IDE" "Loading a Word document needs Windows Excel: Frazaro reads one through Microsoft Word, which Mac Excel cannot drive. Save the procedure as plain text (.txt) and load that instead - it works the same on both. The program on this sheet has not been changed.")
(message ide-pdf-not-supported 5 "VLA-IDE" "Frazaro does not read PDFs: {file} has not been loaded, and the program on this sheet has not been changed. Open the PDF in Word, save it as a Word document (.docx) or as plain text (.txt), and load that. Read it over before you run it - Word rebuilds the lines when it converts a PDF, and it can join two steps into one line and drop the blank line that ends an indented block.")
(message ide-word-no-text 5 "VLA-IDE" "Word found no text in {file}, so nothing was loaded. A scanned or photographed page is a picture of text rather than text, and Frazaro does not read pictures - it has no OCR. Load the document the scan was made from, if you have it, or type the procedure into this sheet. The program on this sheet has not been changed.")
(message ide-word-password 5 "VLA-IDE" "{file} is protected by a password, and Frazaro never asks for one - a password box on a window you cannot see would simply stop Excel. Open the file in Word, remove the password (File > Info > Protect Document > Encrypt with Password, then clear the box), save it, and load it again. The program on this sheet has not been changed.")
(message ide-tag-malformed 5 "VLA-IDE" "{file}, line {line}, looks like a Frazaro tag, but Frazaro cannot read it: {problem}. A tag sits alone on its own line: <Frazaro> above the instructions, and </Frazaro> below them. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-opener-inside-section 5 "VLA-IDE" "{file}, line {line}: this <Frazaro> starts a new section while the one started on line {open} is still open. Put </Frazaro> on a line of its own where that section ends. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-closer-without-opener 5 "VLA-IDE" "{file}, line {line}: </Frazaro> ends a section, but no <Frazaro> above it started one. Put <Frazaro> on a line of its own where the instructions begin, or delete this line. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-unknown-word 5 "VLA-IDE" "{file}, line {line}: Frazaro does not know the word '{word}' in a tag. A word on its own in a tag is for Frazaro - a version like 0.6.2, or a language like espanol. To keep it as a note for people, put it in parentheses: ({word}). To make it a value the section can use, give it a name, like status={word}. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-quoted-name 5 "VLA-IDE" "{file}, line {line}: a quoted name on its own in a tag, like {text}, is kept for naming sections in a later version of Frazaro. For now, put it in parentheses as a note, or give it a name as a value, like title={text}. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-twice 5 "VLA-IDE" "{file}, line {line}: this tag gives {what} twice - keep one. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-bad-name 5 "VLA-IDE" "{file}, line {line}: '{name}' cannot name a value. A value's name starts with a letter and holds only letters, digits, hyphens and underscores, like period or cost-center. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-value-needs-quotes 5 "VLA-IDE" "{file}, line {line}: the value of {name} needs double quotes around it. Without them a value is a single word or number, with no spaces, quotes, parentheses, braces or angle brackets - {name}=\"Week 39\" needs its quotes, and year=2026 does not. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-version-malformed 5 "VLA-IDE" "{file}, line {line}: {version} is not a Frazaro version. A version is three numbers with dots between them, like 0.6.2. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-needs-newer 5 "VLA-IDE" "{file}, line {line}: this section needs Frazaro {need} or later, and this copy is Frazaro {have}. Update Frazaro, then load the file again. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-language-missing 5 "VLA-IDE" "{file}, line {line}: this section is written for the {language} phrasebook, which this copy of Frazaro does not have. Add it with Load Phrasebook, or use the edition of Frazaro made for it. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-placeholder-unknown 5 "VLA-IDE" "{file}, line {line}: {placeholder} is not one of this section's values - the tag on line {open} gives {names}. Add it to that tag, or fix the spelling. To write a brace itself, type it twice. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-placeholder-malformed 5 "VLA-IDE" "{file}, line {line}: {problem}. A placeholder is the name of one of this section's values between braces, and a brace typed twice stands for the brace itself. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-apostrophe-in-sheet-name 5 "VLA-IDE" "{file}, line {line}: the value of {name} contains an apostrophe, and this line puts it inside a sheet name written between apostrophes, like 'Q1 Data'!A1, where an apostrophe ends the name early. Change the value, or name the sheet another way. Nothing was loaded, and the program on this sheet has not been changed.")
(message ide-tag-sections-empty 5 "VLA-IDE" "The <Frazaro> sections in {file} have no instructions in them, so nothing was loaded, and the program on this sheet has not been changed.")
(message ide-undo-snapshot-failed 5 "VLA-IDE" "'{program}' has not run. Before a Run changes anything, Frazaro saves each sheet the Run can change, so Undo Last Run can put it back - and it could not save the sheet '{sheet}' ({reason}). None of the program's sentences ran, and nothing Frazaro made for Undo was left behind. If the workbook is protected (Review > Protect Workbook), unprotect it; then run the program again.")
(message ide-undo-snapshot-failed-copies-left 5 "VLA-IDE" "'{program}' has not run. Before a Run changes anything, Frazaro saves each sheet the Run can change, so Undo Last Run can put it back - and it could not save the sheet '{sheet}' ({reason}). None of the program's sentences ran, but Frazaro could not remove these sheets it had made for Undo: {left}. Delete them (right-click each tab, then Delete), then run the program again.")
(message ide-undo-snapshot-copy-not-found 5 "VLA-IDE" "Excel's copy could not be told apart from the other sheets: {count} new sheets appeared where one was expected")
(message ide-undo-roster-unreadable 5 "VLA-IDE" "The sheets' order, visibility and active sheet were not put back: the record Frazaro kept of them before the last Run, on its sheet '{sheet}', could not be read ({why}). The sheets named above were still put back. The next Run makes a new record.")
(message runtime-helpers-unreadable 5 "VLA-Runtime" "Frazaro could not read the helpers a compiled program runs on, so this program cannot be compiled - this copy of Frazaro is missing part of itself. Reinstall Frazaro, or press Interpret and Run, which runs the program without compiling it.")
(message sec8-untrusted-workbook-effect 5 "VLA-Provenance" "SEC.8: '{verb}' would have an effect outside this workbook, and {why} - so it is refused. The workbook is {path}. If you trust it: close it, right-click the file in File Explorer, choose Properties, tick Unblock, then reopen it. (Frazaro deliberately has no button of its own for this - a workbook that arrives from outside must not be able to carry its own permission slip.)")
(message english-sheet-change-dup 5 "VLA-English" "there is already a 'When the sheet changes:' handler in this program - one program, one handler{loc}")
(message english-click-handler-dup 5 "VLA-English" "there is already a 'When \"{caption}\" is clicked:' handler in this program - one handler per button{loc}")
(message english-click-handler-slug-collision 5 "VLA-English" "'When \"{a}\" is clicked:' and 'When \"{b}\" is clicked:' compile to the same internal name once punctuation and spacing fold away - Compile could not tell the two handlers apart; rename one of the two button captions{loc}")
(message english-param-name-taken 5 "VLA-English" "'{name}' already means something (a built-in or vocabulary word) - pick another parameter name{loc}")
(message english-param-missing-default 5 "VLA-English" "parameter '{name}' has no default, but an earlier parameter does - once one parameter has a default ('of ...'), all the ones after it need defaults too{loc}")
(message english-param-required-after-optional 5 "VLA-English" "parameter '{name}' is required, but an earlier parameter is optional - once one parameter is optional (or has a default), all the ones after it must be too{loc}")
(message english-old-slot-spelling 5 "VLA-English" "'{t}' uses the old question-mark slot spelling - slots are written in braces now: {suggested} in the pattern, and {example} in the template")
(message english-slot-not-closed 5 "VLA-English" "'{t}' looks like a slot but isn't closed - slots are {ex1} or {ex2}, no spaces")
(message english-malformed-slot 5 "VLA-English" "'{t}' is a malformed slot - write {ex1} or {ex2}")
(message english-malformed-default 5 "VLA-English" "'{t}' is a malformed default - write {ex}, both sides non-empty")
(message english-empty-pattern 5 "VLA-English" "empty phrase pattern")
(message english-override-no-match 5 "VLA-English" "the override '{pattern}' matches no earlier rule - use the plain (non-override) directive, or check that the rule it replaces still exists (and loads first)")
(message english-override-ambiguous 5 "VLA-English" "the override '{pattern}' is ambiguous - it matches {count} earlier rules ({list}) and an override replaces exactly one")
(message english-override-matches-builtin 5 "VLA-English" "the override '{pattern}' matches the built-in rule '{builtin}' - the built-in core is not overridable; write a differently-worded rule instead")
(message english-rule-shadow 5 "VLA-English" "{dupMsg}
  If this replacement is intentional, use this rule's own <lingua>-vla-override directive instead of <lingua>-vla.")
(message english-template-not-well-formed 5 "VLA-English" "template does not parse as well-formed VLA: {template}{detail}")
(message english-slot-value-not-one-form 5 "VLA-English" "F.2: bound value for slot '{slot}' did not read back as exactly one form ({count}) - {value}")
(message english-slot-glued-to-identifier 5 "VLA-English" "F.2: slot '{quoted}' is glued onto a larger identifier in its template - only a bare word can bind there, got: {value}")
(message english-render-no-category-renderer 5 "VLA-English" "G-RENDER: no renderer for slot category ':{cat}'")
(message english-render-no-matching-rule 5 "VLA-English" "G-RENDER: no loaded rule's template form matches {form}")
(message english-render-not-single-form 5 "VLA-English" "G-RENDER: EnglishRenderText expects exactly one top-level form, got {count}")
(message english-alternation-empty-branch 5 "VLA-English" "pattern '{pattern}': alternation '{token}' has an empty branch - write {example}, every branch a word")
(message english-unknown-slot-category 5 "VLA-English" "pattern '{pattern}': unknown slot category ':{cat}' - categories are name, var, text, expr, cond, conditions, role, relation, range, cell, column, sheet, color, path (or a list of one: text-list, range-list, cell-list, column-list, sheet-list, color-list); or write an alternation {example}")
(message english-conditions-unbound-role 5 "VLA-English" "nothing in this rule says which {role} it means: \"the {role}\" is only ever compared or ruled out, never listed by a table or named by a relation. Add a condition that finds the {role} first, like \"Staff lists the {role} as <Column>\".")
(message english-conditions-reserved-name 5 "VLA-English" "'{name}' is one of this grammar's own words, so it cannot also name a relation or a set - is, as, lists, not, and, if, contains, and alone are reserved. Pick another name, like \"{name}-of\".")
(message english-conditions-reserved-prefix 5 "VLA-English" "'{name}' starts with vla-, and Frazaro keeps that prefix for the rules it writes itself - a relation or set named that way could merge with one of them and change an answer. Pick a name without it, like \"{suggest}\".")
(message english-conditions-equality-constant 5 "VLA-English" "\"the {role} is {value}\" compares the {role} to one fixed value, and this grammar writes that value where the {role} is read instead: put {value} in the {role}'s place in that condition, like \"Staff lists the person as Name and {value} as <Column>\".")
(message english-conditions-compare-needs-number 5 "VLA-English" "\"the {role}\" is compared with the text \"{text}\", and a comparison needs a number on each side - PROLOG cannot compare text, and DATALOG would compare it by spelling. Write a number without quotes, or read the value from a Table and compare the two roles.")
(message english-constant-quoted-number 5 "VLA-English" "\"{text}\" is a number written in quotes. Write it as {text}, without them: a number cell holds a number, and the quoted text \"{text}\" matches it in DATALOG and silently does not in PROLOG.")
(message english-clause-unbound-head-role 5 "VLA-English" "nothing in this rule says which {role} it means: \"a {role}\" is in what the rule concludes, but none of its conditions finds a {role}, so the rule would hold for every {role} there could be. Add a condition that finds it, like \"Staff lists the {role} as <Column>\".")
(message english-clause-fact-needs-values 5 "VLA-English" "'{role}' is a role, not a value, and this sentence has no \"if\" - a fact names only values. Quote the name you mean, like \"Bob\", or add \"if\" and the conditions that find the {role}.")
(message english-question-same-unknown 5 "VLA-English" "this question asks for {unknown} twice, and one name is one answer, so both would have to be the same thing. Name the two unknowns differently, like \"which employee manages which report\".")
(message english-question-whether-unknown 5 "VLA-English" "a \"whether\" question names every value and answers TRUE or FALSE, but this one also asks for {unknown}. Drop \"whether\" to list the answers, or quote the value you mean.")
(message english-question-range-splits-relation 5 "VLA-English" "'{relation}' is also written in cell {cell}, which {range} leaves out, so this question would answer from only part of '{relation}' and say nothing about the rest. Widen the range to include {cell}, or move that rule inside {range}.{loc}")
(message english-conditions-closure-needs-relation 5 "VLA-English" "\"directly or not\" can only follow a relation between two things, like \"the person reports-to the boss directly or not\" - it means one step along that relation, or more. Here it follows {shape}, which is not a relation.")
(message english-clause-closure-in-head 5 "VLA-English" "\"directly or not\" belongs in a condition or a question, not in what a rule concludes. Say it after the relation a condition reads, like \"a person is-under a boss if the person {relation} the boss directly or not\".")
(message english-clause-left-recursion 5 "VLA-English" "this rule's first condition asks '{relation}' again before any other condition has found a value, so PROLOG would ask it again and again and never finish. Put that condition last, after the conditions that find its values, like \"... if the person reports-to the middle, and the middle {relation} the boss\".")
(message english-clause-relation-names-table 5 "VLA-English" "'{relation}' names both this rule and the table it reads, and a relation named after a table IS that table - so the rule only reads itself: PROLOG never finishes, and the rule adds nothing to what the table says. Give the relation a name of its own.")
(message english-clause-otherwise-shape 5 "VLA-English" "\"otherwise\" gives '{relation}' a different value for the same thing when the conditions before it do not hold, so it needs a rule about a role and a second value, like: a customer has-tier \"Gold\" if ..., otherwise \"Silver\" if .... This rule concludes about a fixed value, or has no second value to give.")
(message english-clause-otherwise-needs-if 5 "VLA-English" "each value after \"otherwise\" needs its own \"if\" and the conditions that choose it, like: ..., otherwise \"Bronze\" if Customers lists the customer as Customer. A value with no conditions would hold for everything '{relation}' could be about.")
(message english-clause-otherwise-reads-itself 5 "VLA-English" "a rule that chooses its first match with \"otherwise\" cannot also ask '{relation}' in its own conditions, because which value holds would then depend on which value holds. Read what the choice needs from a table or from another relation.")
(message english-program-first-match-split 5 "VLA-English" "'{relation}' is chosen with \"otherwise\" in cell {cell}, and cell {othercell} writes '{relation}' again, so a value from {othercell} would stand beside the one \"otherwise\" chose. Put every choice for '{relation}' in the one sentence in {cell}.{loc}")
(message english-question-list-shape 5 "VLA-English" "\"as one list\" joins the answers to a who, what or which question with one unknown in one cell, like: who can-cover \"Night\" as one list - or gives one list for each member of a set, like: who can-cover each shift that is listed as one list. It cannot follow {shape}.")
(message english-program-relation-names-table 5 "VLA-English" "'{relation}' is written in cell {cell}, and the rule in cell {tablecell} reads a table also called '{relation}' - a relation named after a table IS that table, so these rules read themselves: PROLOG never finishes, and the relation adds nothing to what the table says. Give the relation a name of its own.{loc}")
(message english-optional-empty-branch 5 "VLA-English" "pattern '{pattern}': optional '{token}' has an empty branch - write [word] or [word|word]")
(message english-bare-alternation-empty-branch 5 "VLA-English" "pattern '{pattern}': alternation '{token}' has an empty branch - write word|word, every branch a word")
(message english-optional-not-closed 5 "VLA-English" "'{token}' looks like an optional literal but isn't closed - optionals are [word], one word, no spaces")
(message english-surface-spec-multi-slash 5 "VLA-English" "pattern '{pattern}': {where} '{spec}' has more than one '/' - a form is word or stem/suffix; write further spellings as separate branches")
(message english-surface-spec-empty-side 5 "VLA-English" "pattern '{pattern}': {where} '{spec}' has an empty side around '/' - write stem/suffix, both parts non-empty")
(message english-form-never-closes 5 "VLA-English" "this VLA form never closes - {depth} '(' still open by the end of the program{loc}")
(message english-unknown-character 5 "VLA-English" "I don't understand the character '{char}'{hint}{loc}")
(message english-library-name-not-quoted 5 "VLA-English" "The library name must be quoted - file names contain periods, and a period ends a sentence. Write: Use library \"helpers.vla\". near: '{context}'{loc}")
(message english-path-not-quoted 5 "VLA-English" "A file path must be quoted - file names contain periods, and a period ends a sentence. Write: Open workbook \"C:\\Reports\\file.xlsx\". (or bind a variable first: Set report-path to \"C:\\Reports\\file.xlsx\". then Open workbook report-path.) near: '{context}'{loc}")
(message english-expected-near 5 "VLA-English" "Expected {what} near: '{context}'{loc}")
(message english-name-has-colon 5 "VLA-English" "A name cannot contain ':' - got '{word}' near: '{context}'{loc}")
(message english-expected-word-near 5 "VLA-English" "Expected '{word}' near: '{context}'{loc}")
(message english-top-level-definition-in-row 5 "VLA-English" "'({head} ...)' is a top-level VLA definition - a sheet row is a statement inside your program. Define subs, macros, and types in a module or vocabulary instead{loc}")
(message english-form-balance-hint 5 "VLA-English" "{hint}{loc}")
(message english-form-doesnt-transpile 5 "VLA-English" "this VLA form doesn't transpile - {detail}{loc}")
(message english-expected-sentence-blank-line 5 "VLA-English" "Expected a sentence but found a blank line")
(message english-if-fails-misplaced 5 "VLA-English" "'If that fails:' must start its own paragraph right after the Try block it rescues - add a blank line (or 'Done.') before it, and make sure a 'Try:' comes first - near: '{context}'{loc}")
(message english-stop-loop-outside-loop 5 "VLA-English" "'Stop the loop.' only makes sense inside a loop - near: '{context}'")
(message english-percent-mixed-amount 5 "VLA-English" "'{sentence}' mixes % into a longer amount - a plain share works ('Increase total by 10%.' grows it by 10%), and a plain number works, but a blend has two readings and I will not pick one. Compute the amount first ('Set step to ...') and then {suggestion}{loc}")
(message english-standalone-get 5 "VLA-English" "'Get {fn} using ...' is a value, not an instruction - put the value somewhere: 'Set fee to get {fn} using ...' (or use it inside a condition){loc}")
(message english-give-back-outside-action 5 "VLA-English" "'Give back' only makes sense inside a value-returning action ('To tax of amount: ... Give back ...') - to show a value use Show, to stop use Stop - near: '{context}'{loc}")
(message english-when-it-is-first 5 "VLA-English" "'When it is ...' continues a choice - the first sentence names the value being examined, like 'When region is \"North\":' - near: '{context}'{loc}")
(message english-click-handler-needs-quotes 5 "VLA-English" "a button click handler's name needs quotes - use 'When \"{tok}\" is clicked:' instead of 'When {tok} is clicked:'{loc}")
(message english-clicked-misspelled 5 "VLA-English" "'When {tok} is {misspelled}:' looks like a button click handler with 'clicked' misspelled as '{misspelled}' - use 'When {tok} is clicked:'{loc}")
(message english-button-not-created-with-create 5 "VLA-English" "a button isn't created with 'Create ... called ...' - use 'Make a button \"<caption>\" at cell <cell>.' instead{loc}")
(message english-pivot-not-created-with-create 5 "VLA-English" "a pivot table isn't created with 'Create ... called ...' - use 'Make a pivot table from <range> at <cell> called \"<name>\".' instead{loc}")
(message english-create-unknown-kind 5 "VLA-English" "Create what? Say 'a number', 'a text', 'a value', 'a list', or 'a lookup', not '{kind}'")
(message english-to-not-top-level 5 "VLA-English" "'To ...' definitions must be at the top level, not inside a block")
(message english-define-not-top-level 5 "VLA-English" "'Define ...' must be at the top level, not inside a block")
(message english-unexpected-token-block 5 "VLA-English" "Unexpected '{tok}' - is there a stray 'Done.' or a missing block?")
(message english-parse-error 5 "VLA-English" "{msg}")
(message english-unknown-slot-category-runtime 5 "VLA-English" "Unknown slot category ':{cat}' in a phrase pattern")
(message english-action-unknown-param 5 "VLA-English" "the action '{action}' has no parameter called '{param}'. Its parameters are: {list}{loc}")
(message english-param-given-twice 5 "VLA-English" "the parameter '{param}' was given twice in this call to '{action}'{loc}")
(message english-call-missing-required-param 5 "VLA-English" "the call to '{action}' is missing its required parameter '{param}'. Its parameters are: {list}{loc}")
(message english-expected-value 5 "VLA-English" "Expected a value near: '{context}'")
(message english-expected-condition 5 "VLA-English" "Expected a condition near: '{context}'")
(message english-define-value-immutable 5 "VLA-English" "'{name}' was given a fixed value by Define and cannot be changed - use a different name{loc}")
(message english-reserved-word-name 5 "VLA-English" "'{name}' is a reserved word in Excel's programming language and cannot be used as a name - a hyphenated name like '{name}-row' or 'my-{name}' always works")
(message english-value-word-name 5 "VLA-English" "'{name}' is a language word for a value and cannot be used as a name - try '{name}-stamp' or similar")
(message english-cell-shaped-name 5 "VLA-English" "'{name}' is shaped like a cell, so it cannot be a name. To mean cell {cell}, write the word cell in front of it: 'Put 5 into cell {cell}.' or 'Set total to cell {cell} plus 1.' To keep a value under a name, choose one that is not shaped like a cell, like '{name}-total'.{loc}")
(message english-engine-call-name 5 "VLA-English" "'{name}' already means something to Excel, and the code Frazaro writes for your sentences uses it by that name, so it cannot be one of your names: yours would take Excel's place. A hyphenated name like 'my-{name}' or '{name}-value' always works.{loc}")
(message english-action-name-taken 5 "VLA-English" "there is already an action called '{name}' in this program - one name, one definition{loc}")
(message english-action-name-means-something 5 "VLA-English" "'{name} of ...' already means something (a built-in or vocabulary word) - pick another name for the action{loc}")
(message english-vocab-file-not-found 53 "VLA-English" "Vocabulary file not found: {path}")
(message english-vocab-nesting-too-deep 5 "VLA-English" "{loc}: a generator's own expansion nests (begin ...) more than 20 levels deep - almost certainly a mistake, not a real vocabulary")
(message english-vocab-expected-directive 5 "VLA-English" "{loc}: expected a directive (a parenthesized form), got a bare word '{word}'")
(message english-vocab-at-row-arity 5 "VLA-English" "{loc}: (at-row label form) takes exactly two arguments - a row label and one wrapped form (use (begin ...) to wrap several)")
(message english-vocab-test-fail-empty-fragment 5 "VLA-English" "{loc}: a test-fail proof protects the MESSAGE, not just the refusal - give a non-empty fragment")
(message english-vocab-expansion-not-directive 5 "VLA-English" "{loc}: a generator's expansion produced '{head}', which is not a vocabulary directive (english-vla/test-success/test-fail/defmacro/english-function, or an override) - check the generator macro's own body")
(message english-vocab-unrecognized-directive 5 "VLA-English" "{loc}: unrecognized top-level directive '{head}'")
(message english-vocab-requires-version-unmet 5 "VLA-English" "{loc}: this phrasebook needs Frazaro {wanted} or newer; this is {have} - upgrade Frazaro, or use a build of the phrasebook written for {have}")
(message english-vocab-requires-version-malformed 5 "VLA-English" "{loc}: '{wanted}' is not a version - a (requires-version ...) declaration takes a plain MAJOR.MINOR.PATCH number in quotes, like (requires-version \"0.5.2\")")
(message english-vocab-requires-missing-value 5 "VLA-English" "{loc}: this (requires-{namespace} ...) declaration names no value - it takes exactly one, in quotes, like (requires-{namespace} \"...\"); a bare word is not one")
(message english-vocab-requires-unknown-namespace 5 "VLA-English" "{loc}: '{namespace}' is not a kind of requirement this build understands (it knows version, capability and form), so it cannot confirm the requirement was met and will not load the phrasebook - this phrasebook was most likely written for a newer Frazaro than {have}, and a (requires-version ...) declaration would have said exactly which one")
(message english-vocab-requires-capability-ungranted 5 "VLA-English" "{loc}: this phrasebook requires the '{capability}' capability, and no capability can be granted yet - the consent step that would let you approve one is not built (SEC.7). Nothing can load this phrasebook today; remove the declaration only if the phrasebook genuinely does not use that capability")
(message english-vocab-requires-form-unsupported 5 "VLA-English" "{loc}: (requires-form \"{form}\") is understood but not yet enforceable - the record of which release each form first worked in (docs/GRAMMAR_SINCE.md) is not carried inside Frazaro yet, so this build cannot check it and refuses rather than passing it silently. Use (requires-version ...) for now")
(message english-vocab-requires-from-expansion 5 "VLA-English" "{loc}: '{head}' was produced by a generator's expansion, not written in the file - a requirement is read from the source text before anything loads, so one that only appears after expansion is never actually checked. Write it literally, at the top of the phrasebook")
(message english-vocab-macro-expansion-failed 5 "VLA-English" "{loc}: this directive names a macro ('{head}') but its own expansion failed - {detail}")
(message english-vocab-file-already-carried-same 5 "VLA-English" "{loc}: this session already carries this file, and loading it again would define every one of its words twice - press Reload Instructions, which starts from a fresh grammar")
(message english-vocab-macro-name-collision 5 "VLA-English" "{loc}: a macro named '{name}' is already carried by {prev} - rename this one (macro override semantics are not defined)")
(message english-vocab-macro-form-invalid 5 "VLA-English" "{loc}: this macro form does not stand - {detail}")
(message english-extra-words-after-statement 5 "VLA-English" "extra words after the first statement")
(message english-test-failed 5 "VLA-English" "{loc}: test FAILED
  sentence: {sentence}
  expected: {expected}
  got:      {got}")
(message english-test-failed-to-translate 5 "VLA-English" "{loc}: test FAILED to translate
  sentence: {sentence}
  error:    {error}")
(message english-failtest-translated 5 "VLA-English" "{loc}: fail: proof FAILED - the sentence translated instead of refusing
  sentence: {sentence}
  became:   {became}")
(message english-failtest-message-drifted 5 "VLA-English" "{loc}: fail: proof FAILED - the refusal message drifted
  sentence: {sentence}
  wanted:   {wanted}
  message:  {message}")
(message english-call-unknown-param 5 "VLA-English" "'{call}': the action '{action}' has no parameter called '{param}'. Its parameters are: {list}{loc}")
(message english-call-missing-param 5 "VLA-English" "'{call}': the action '{action}' requires '{param}' - add: with {param} of ...{loc}")
(message english-program-file-not-found 53 "VLA-English" "Program file not found: {path}")
(message english-translate-vla-overwrite 5 "VLA-English" "Translate to VLA: refusing to overwrite the source file ({path}) - point this at a .txt/.en program, not an already-.vla file.")
(message english-translate-vba-overwrite 5 "VLA-English" "Translate to VBA: refusing to overwrite the source file ({path}) - point this at a .txt/.en program, not an already-.vba file.")
(message english-define-needs-fixed-value 5 "VLA-English" "Define needs a fixed value - quoted text (\"#FF69B4\"), a number, or an earlier alias - near: '{context}'")
(message english-function-arity 5 "VLA-English" "{loc}: a function directive takes a quoted pattern and one target, like {example}")
(message english-function-phrase-shape 5 "VLA-English" "{loc}: the phrase '{pattern}' {why}. A phrase is fixed words, then one value - {holes} - then at most one closing clause of fixed words and one choice of words, like {choice}.")
(message english-function-phrase-after-value-word 5 "VLA-English" "{loc}: the phrase '{pattern}' uses '{word}' after its first word, and a value is already read with '{word}' after it, so a sentence that reads today would read differently. Choose another word.")
(message english-function-phrase-duplicate 5 "VLA-English" "{loc}: the phrase '{pattern}' has the same words before its value as '{other}', so a value would have two readings.")
(message english-function-phrase-alias-word 5 "VLA-English" "{loc}: '{word}' is both a keyword alias and a word of the phrase '{pattern}' - an alias rewrites its word in every sentence before any phrase is read, so no sentence could say the phrase.")
(message english-function-phrase-template 5 "VLA-English" "{loc}: the phrase '{pattern}': its template {why}.")
(message english-phrase-incomplete 5 "VLA-English" "I understood '{understood}' - then I expected {expected} but found {found}. The phrase is '{phrase}'.{loc}")
(message english-vocab-raw-consent-declined 5 "VLA-English" "'{source}' was not loaded - it contains a (raw ...) form, which runs unrestricted VBA once a program using it runs, and consent for it was declined")
(message unify-glue-multiple-slots 5 "VLA-Unify" "'{atom}' glues more than one slot into a single atom - not supported yet")
(message prolog-occurs-check 5 "VLA-Unify" "variable {var} can't bind to a term that contains itself - that would build an infinite term, which can never render, spill to a worksheet, or be audited")
(message prolog-top-form-not-a-list 5 "VLA-Prolog" "expected a form like (fact ...), (rule ...), or (query ...), but found something else.")
(message prolog-top-form-empty 5 "VLA-Prolog" "found an empty () where a top-level (fact ...)/(rule ...)/(query ...) form was expected.")
(message prolog-top-form-bad-head 5 "VLA-Prolog" "a top-level form's own head must be a plain word (fact/rule/query), not a nested form or a quoted string.")
(message prolog-unknown-top-form 5 "VLA-Prolog" "'{head}' isn't a form PROLOG recognizes at the top level - only (fact ...), (rule ...), and (query ...) are supported.")
(message prolog-atom-not-a-list 5 "VLA-Prolog" "expected a predicate form like (name arg1 arg2 ...) in {context}, but found something else.")
(message prolog-atom-empty 5 "VLA-Prolog" "found an empty () where a predicate form was expected, in {context}.")
(message prolog-predicate-name-not-symbol 5 "VLA-Prolog" "a predicate's name must be a plain word, in {context} - not a nested form or a quoted string.")
(message prolog-fact-bad-shape 5 "VLA-Prolog" "(fact ...) takes exactly one predicate form, like (fact (parent tom bob)).")
(message prolog-fact-has-variable 5 "VLA-Prolog" "predicate '{predicate}' in a (fact ...) has a variable ({var}) - facts must be fully ground; a variable only ever belongs in a (query ...).")
(message prolog-rule-needs-body 5 "VLA-Prolog" "(rule ...) needs a head plus at least one body predicate, like (rule (grandparent X Z) (parent X Y) (parent Y Z)) - a head with no body at all is just a fact, so write it as (fact ...) instead.")
(message prolog-arity-mismatch 5 "VLA-Prolog" "predicate '{predicate}' is used with {a} argument(s) in one place and {b} in another - every use of one predicate must have the same arity.")
(message prolog-query-bad-shape 5 "VLA-Prolog" "(query ...) needs at least one predicate form, like (query (parent tom X)).")
(message prolog-query-missing 5 "VLA-Prolog" "this program has no (query ...) - PROLOG needs exactly one, naming what to answer.")
(message prolog-clauses-empty 5 "VLA-Prolog" "the clauses text is empty, or holds only comments, so PROLOG has nothing to read - if the formula reads a cell or a range, check that it holds the clauses. A program needs at least a (query ...), like (fact (p a)) (query (p X)).")
(message prolog-query-ambiguous 5 "VLA-Prolog" "this program has {count} (query ...) forms - PROLOG needs exactly one.")
(message prolog-list-ceiling 5 "VLA-Prolog" "{form} tried to gather {count} things into one list, and PROLOG gathers at most {max} into one - reading a Table of any size is fine, it is holding it all in one value that is not. Ask it as a DATALOG question instead, which counts a set of any size.")
(message prolog-value-too-long-for-a-cell 5 "VLA-Prolog" "the answer for {var} is {length} characters long, and an Excel cell holds at most 32,767 - ask for its length with (length ...), or ask for the rows one at a time instead of gathering them into one list.")
(message prolog-depth-ceiling 5 "VLA-Prolog" "this query went more than {depth} rules deep without finishing. That is a rule that calls itself without ever getting closer to a fact, data that loops back on itself (A to B to C and back to A), or a chain deeper than PROLOG follows - a DATALOG question answers a chain of any depth, and never loops.")
(message prolog-work-ceiling 5 "VLA-Prolog" "this query tried more than {work} facts and rules without finishing. That is how much SEARCHING one question may do, never how large a Table may be: reading a Table spends one try per row, and joining two spends one per pair, so this is a large Table or a join of several - never a runaway rule. Put a quoted value where the query has an unknown, so there is less to try, or ask it as a DATALOG question, which joins large Tables without trying every pair.")
(message prolog-reserved-predicate-name 5 "VLA-Prolog" "'{name}' is a reserved word in PROLOG (is/not/findall/!/between/list/or/if, the six comparisons < > =< >= =:= =\\=, the four term-matching goals = \\= == \\==, the ten type tests var? nonvar? atom? number? atomic? compound? callable? is-list? ground? whole?, the six list goals length member nth append reverse sum-list, the ten text goals atom-length atom-concat sub-atom atom-number upcase-atom downcase-atom atomic-list-concat text-starts-with text-ends-with text-contains, the nine ISO spellings var nonvar atom number atomic compound callable is_list ground - reserved only so PROLOG can point you at the question-mark form instead of failing silently - the four number-type names integer? float? integer float, reserved and refused because PROLOG has one kind of number, the fourteen alias spellings is-list is_list? sum_list whole atom_length atom_concat sub_atom atom_number upcase_atom downcase_atom atomic_list_concat text_starts_with text_ends_with text_contains, reserved only so PROLOG can point you at the spelling it does use, the impure goals assert asserta assertz retract retractall abolish write writeln print nl format writeq write_canonical write-canonical write_term write-term read read_term read-term consult halt b_setval b-setval b_getval b-getval nb_setval nb-setval nb_getval nb-getval gensym random random_between random-between random_member random-member random_permutation random-permutation get_time get-time, refused for good because a formula must answer from what it is given and nothing else, and the two control spellings -> \\+, reserved the same way so PROLOG can point you at the word it writes instead) and can't be used as a predicate name in a (fact ...) or (rule ...).")
(message prolog-not-bad-shape 5 "VLA-Prolog" "(not ...) needs exactly one argument - the goal to negate, like (not (likes bob pizza)).")
(message prolog-findall-bad-shape 5 "VLA-Prolog" "(findall ...) needs exactly three arguments - a template, a goal, and a target list, like (findall X (likes bob X) Bag).")
(message prolog-is-bad-shape 5 "VLA-Prolog" "(is ...) needs exactly two arguments - a target and an arithmetic expression, like (is Total (+ X Y)).")
(message prolog-or-bad-shape 5 "VLA-Prolog" "(or ...) needs at least two goals to choose between, like (or (parent X) (guardian X)) - one alternative on its own is almost always a branch that was deleted by mistake. PROLOG writes disjunction as (or ...) rather than the ';' real Prolog uses, because a ';' here starts a comment that runs to the end of the line.")
(message prolog-if-bad-shape 5 "VLA-Prolog" "(if ...) needs a condition and a then-goal, and may take an else-goal after them - like (if (member X L) (found X) (missing X)), or (if (member X L) (found X)) with no else. PROLOG has no else-if chain: write a further (if ...) as the else-goal.")
(message prolog-control-iso-spelling 5 "VLA-Prolog" "{form} is how real Prolog spells this; PROLOG writes {fixed} instead, with the control word first like every other form here. Note that ';' cannot separate alternatives in PROLOG at all - it starts a comment that runs to the end of the line, so a ';' in a rule body quietly changes the rule rather than splitting it.")
(message prolog-comparison-bad-shape 5 "VLA-Prolog" "{form} needs exactly two arguments - the two numbers to compare, like (> Salary 80000).")
(message prolog-unification-bad-shape 5 "VLA-Prolog" "{form} needs exactly two arguments - the two terms to match, like (= X 1).")
(message prolog-type-test-bad-shape 5 "VLA-Prolog" "{form} needs exactly one argument - the term to classify, like (number? Salary).")
(message prolog-type-test-iso-spelling 5 "VLA-Prolog" "{form} isn't how PROLOG spells this type test - every one of them ends in a question mark, so write {fixed} instead, like (number? Salary).")
(message prolog-type-test-number-type 5 "VLA-Prolog" "{form} isn't available: PROLOG has one kind of number, so nothing here tells an integer from a float - 3 and 3.0 are the same value here, and that is settled rather than pending. Ask (number? X) for 'is this a number at all', or (whole? X) for 'is this a number with no fractional part' - the question {fixed} was reaching for, under a name that promises no type. {fixed} stays reserved, and so does the spelling without the question mark, so a program you write today keeps working.")
(message prolog-alias-spelling 5 "VLA-Prolog" "{form} isn't how PROLOG spells this - write {fixed} instead. PROLOG joins the words of a name with a hyphen rather than an underscore, and ends a name that ASKS something with a question mark.")
(message prolog-impure-database 5 "VLA-Prolog" "{form} is refused for good: PROLOG never changes its own facts and rules while it answers. Excel recalculates a formula whenever it chooses, as often as it chooses, so a fact one run added would change the next run's answer - and since every run starts again from the program text, no other formula could ever see it. To collect answers, use (findall X Goal Bag); to count them, (length Bag N). A fact that should exist belongs in the program, or in a table you pass to PROLOG.")
(message prolog-impure-output 5 "VLA-Prolog" "{form} is refused for good: a formula in a cell has nowhere to print - what PROLOG returns IS its output. To see a value, name its variable in the query and it fills a column of the result, one row per answer; to build a piece of text, use atom-concat or atomic-list-concat.")
(message prolog-impure-state 5 "VLA-Prolog" "{form} is refused for good: PROLOG keeps no values between goals except in their arguments. In Prolog a value set this way outlives the query that set it, and Excel recalculates a formula whenever it chooses, as often as it chooses - so a counter or a remembered value would make the answer depend on how many times it had run. Pass the value along as an argument instead, working out the next one with is, like (is N1 (+ N 1)); to number the answers, collect them with findall and count them with length.")
(message prolog-impure-volatile 5 "VLA-Prolog" "{form} is refused for good: its answer would change every time Excel recalculates, even when nothing it was given has changed, and a PROLOG answer must depend only on the program and the tables you pass it. Excel's own RAND(), RANDBETWEEN() and NOW() do this job in the open - put one in a cell of a table you pass to PROLOG, and PROLOG reads that value like any other.")
(message prolog-impure-outside 5 "VLA-Prolog" "{form} is refused for good: PROLOG reads nothing but its own program text and the tables you pass it, and there is no session for it to end. Excel recalculates a formula only when something the formula names has changed, so anything read from a file or a prompt could leave the answer silently out of date. Put the data in a table and pass the table to PROLOG.")
(message prolog-unknown-predicate 5 "VLA-Prolog" "'{predicate}' is called by this query - directly or through a rule it uses - but nothing defines it: no (fact ...), no (rule ...) and no table argument has that name, so no goal naming it could ever be proved. Check the spelling, or that its table is passed to PROLOG and named to match; if it is a built-in of another Prolog, PROLOG does not have it.")
(message prolog-cut-not-a-form 5 "VLA-Prolog" "cut is written on its own - a bare ! between the goals of a rule or query, like (rule (first X) (p X) !) - never in parentheses: (! ...) is not a goal PROLOG can run.")
(message prolog-quoted-versus-bare 5 "VLA-Prolog" "the text \"{text}\" and the {kind} {text} are different things in PROLOG - a text cell keeps its quotes, so if you meant the cell's own value write it as \"{text}\".")
(message prolog-quoted-versus-bare-no-rows 5 "VLA-Prolog" "this query found no rows at all, and the likeliest reason is a quoting mismatch: the text \"{text}\" and the {kind} {text} are different things in PROLOG. A text cell keeps its quotes, so if you meant the cell's own value write it as \"{text}\".")
(message prolog-list-bad-shape 5 "VLA-Prolog" "{form} needs exactly {count} arguments. The six list goals are (length L N), (member X L), (nth N L X), (append A B C), (reverse L R) and (sum-list L N).")
(message prolog-list-is-not-a-goal 5 "VLA-Prolog" "(list ...) builds a list, it is not something PROLOG can prove - so it belongs in an argument, not where a goal goes. To ask something ABOUT a list, use a list goal: (member X L), (length L N), (nth N L X), (append A B C), (reverse L R) or (sum-list L N).")
(message prolog-list-not-a-list 5 "VLA-Prolog" "{form} needs a list, but found '{value}'. A list is built with cons and ends in nil - (cons a (cons b nil)) is the list a, b - and the empty list is written nil. A findall bag is already one.")
(message prolog-list-given-text 5 "VLA-Prolog" "{form} needs a list, but found the text '{value}' - for text, {fixed} is the goal that does this job. A list is built with cons and ends in nil - (cons a (cons b nil)) is the list a, b.")
(message prolog-text-bad-shape 5 "VLA-Prolog" "{form} needs exactly {count} arguments. The text goals are (atom-length Text N), (atom-concat A B Whole), (sub-atom Text Before Length After Part), (atom-number Text N), (upcase-atom Text Upper), (downcase-atom Text Lower), (atomic-list-concat Parts Separator Whole), (text-starts-with Text Start), (text-ends-with Text End) and (text-contains Text Part).")
(message prolog-text-unbound 5 "VLA-Prolog" "{form} can't run yet - {need}, and {var} is still unbound. Bind it first, from a table or an earlier goal in the query.")
(message prolog-text-not-text 5 "VLA-Prolog" "{form} works on text - a quoted string, a name or a number - but found '{value}', which is a compound term.")
(message prolog-text-not-a-number 5 "VLA-Prolog" "{form} expected a number there but found '{value}', which isn't one - note that a text cell reading 5 is not the number 5.")
(message prolog-text-too-many-ways 5 "VLA-Prolog" "{form} would have to try {count} ways of taking apart a text {length} characters long, and a whole query can try at most {max} - bind more of its arguments so it has fewer ways to try.")
(message prolog-text-outside-bmp 5 "VLA-Prolog" "{form} counts characters, and '{value}' holds one that Excel stores as two - an emoji, or a letter from a rarely used script. Excel's LEN counts it as 2 and Prolog counts it as 1, so PROLOG refuses rather than guess which you meant.")
(message prolog-text-case-unsupported 5 "VLA-Prolog" "{form} changes the case of Latin letters - A to Z and the accented letters of Western and Central European languages - but will not guess at '{char}' (U+{code}): either its script's case rules are not carried here, or, like the Turkish dotless i, its case depends on the language it is written in.")
(message prolog-text-empty-separator 5 "VLA-Prolog" "(atomic-list-concat ...) can't split text on an empty separator - there is no one way to cut text at every nothing. Give it a separator, such as a comma; joining with an empty separator is fine.")
(message prolog-between-bad-shape 5 "VLA-Prolog" "(between ...) needs exactly three arguments - a low bound, a high bound, and the value to generate or test, like (between 1 10 X).")
(message prolog-between-not-whole-number 5 "VLA-Prolog" "(between ...) counts in whole numbers, but '{value}' isn't one.")
(message prolog-between-not-a-number 5 "VLA-Prolog" "(between ...) generates or tests numbers, but its third argument is '{value}', which isn't one - note that a text cell reading 5 is not the number 5.")
(message prolog-between-range-too-wide 5 "VLA-Prolog" "(between {low} {high} ...) would generate {count} values, and a whole query can try at most {max} - narrow the range, or bind the third argument to test one value instead of generating them all.")
(message prolog-arith-unknown-operator 5 "VLA-Prolog" "'{op}' isn't an arithmetic operator PROLOG recognizes inside {form} - the ones it knows are + - * / mod rem // min max ** abs sign sqrt truncate round ceiling floor.")
(message prolog-arith-wrong-arity 5 "VLA-Prolog" "'{op}' inside {form} needs exactly {count}, like {example}.")
(message prolog-arith-domain-error 5 "VLA-Prolog" "{form} can't compute '{op}' of that value - the answer isn't a real number. The square root of a negative, or a negative raised to a fractional power, has no answer PROLOG can give.")
(message prolog-arith-overflow 5 "VLA-Prolog" "{form} can't compute '{op}' of those values - the answer is larger than any number PROLOG can represent.")
(message prolog-arith-unbound-variable 5 "VLA-Prolog" "{form} can't compute a value that still has an unbound variable ({var}) in it.")
(message prolog-arith-not-numeric 5 "VLA-Prolog" "{form} expected a number but found '{value}', which isn't one.")
(message prolog-arith-divide-by-zero 5 "VLA-Prolog" "{form} tried to divide by zero.")
(message prolog-table-not-a-range 5 "VLA-Prolog" "every PROLOG table argument must be a cell range - pass a reference like Employees, not a computed value.")
(message prolog-table-needs-a-name 5 "VLA-Prolog" "this range has no name PROLOG can use as a predicate - make it an Excel Table (Ctrl+T) or give it a defined name, then reference that name in the formula.")
(message prolog-table-noncontiguous-columns 5 "VLA-Prolog" "a table argument spanning multiple disjoint areas (a Ctrl-selected, non-contiguous range) isn't supported - select one contiguous block of the table's own columns instead.")
(message prolog-atom-mixed-keying 5 "VLA-Prolog" "'{predicate}' is table-sourced, but its own arguments here aren't consistently keyed - either key every argument by its own column name, like (name Alice), or use plain positional arguments throughout, never a mix.")
(message prolog-unknown-column 5 "VLA-Prolog" "'{column}' isn't a column of '{predicate}' - its own columns are: {columns}.")
(message prolog-keyed-column-repeated 5 "VLA-Prolog" "'{column}' is keyed more than once in the same '{predicate}' atom - each column name may appear at most once per (predicate (col val) ...) form.")
(message datalog-compound-term 5 "VLA-Datalog" "DATALOG doesn't allow one predicate nested inside another's argument, in {context} - write two rules instead of nesting them (this is what keeps every DATALOG() query guaranteed to finish).")
(message datalog-atom-not-a-list 5 "VLA-Datalog" "expected a predicate form like (name arg1 arg2 ...) in {context}, but found something else.")
(message datalog-atom-empty 5 "VLA-Datalog" "found an empty () where a predicate form was expected, in {context}.")
(message datalog-predicate-name-not-symbol 5 "VLA-Datalog" "a predicate's name must be a plain word, in {context} - not a nested form or a quoted string.")
(message datalog-predicate-needs-argument 5 "VLA-Datalog" "'{predicate}' has no arguments - DATALOG predicates need at least one, e.g. (fact ({predicate} some-value)) rather than (fact ({predicate})).")
(message datalog-top-form-not-a-list 5 "VLA-Datalog" "every top-level line in a DATALOG program must be a (fact ...), (rule ...), or (query ...) form.")
(message datalog-top-form-empty 5 "VLA-Datalog" "found an empty () at the top level - expected (fact ...), (rule ...), or (query ...).")
(message datalog-top-form-bad-head 5 "VLA-Datalog" "a top-level form's first word must be fact, rule, or query - not a nested form.")
(message datalog-fact-bad-shape 5 "VLA-Datalog" "(fact ...) takes exactly one predicate form, like (fact (parent tom bob)).")
(message datalog-fact-has-variable 5 "VLA-Datalog" "fact '{predicate}' uses '{arg}', which looks like a variable (it starts with a capital letter) - facts must be fully specific; did you mean to write a rule instead?")
(message datalog-rule-needs-body 5 "VLA-Datalog" "a (rule head ...) needs at least one body predicate after the head - a rule with no body is a fact; use (fact ...) instead.")
(message datalog-query-bad-shape 5 "VLA-Datalog" "(query ...) takes exactly one thing: a relation's name, like (query indirect_report), to list its rows; one fact written out whole, like (query (route \"A\" \"D\")), to answer TRUE or FALSE; or one fact under (not ...), which may hold blanks, like (query (not (route \"A\" X))), to answer TRUE when nothing matches.")
(message datalog-headless-bad-shape 5 "VLA-Datalog" "(headless) takes no arguments - write it exactly as (headless) to skip the header row and return only data rows.")
(message datalog-query-missing 5 "VLA-Datalog" "add (query predicate-name) to say which relation DATALOG should return - for example (query indirect_report) - or (query (route \"A\" \"D\")) to ask whether one fact holds, or (query (not (route \"A\" X))) to ask whether nothing matches.")
(message datalog-rules-empty 5 "VLA-Datalog" "the rules text is empty, or holds only comments, so DATALOG has nothing to read - if the formula reads a cell or a range, check that it holds the rules. A program needs at least a (query ...), like (fact (p a)) (query p).")
(message datalog-query-atom-has-variable 5 "VLA-Datalog" "(query ({predicate} ...)) holds the variable '{var}', and a query written as a fact answers only TRUE or FALSE, so every value in it must be written in. To list the values '{var}' can take, put the question in a rule and query the rule by name, like (rule (answer {var}) ({predicate} ...)) (query answer).")
(message datalog-query-keyed-atom 5 "VLA-Datalog" "(query ({predicate} (column value) ...)) keys its values by column name, and a query answers TRUE or FALSE only for a fact written out whole - one value per column, in order, like (query ({predicate} value1 value2)). To ask by column name, write a rule that reads the table that way and query the rule by name.")
(message datalog-query-headless-answer 5 "VLA-Datalog" "(headless) asks for rows without their header, but (query ({predicate} ...)) answers a single TRUE or FALSE, which has neither - remove (headless), or query a relation by name to get rows.")
(message datalog-query-ambiguous 5 "VLA-Datalog" "found {count} (query ...) forms - DATALOG needs exactly one, naming the single relation to return.")
(message datalog-unknown-top-form 5 "VLA-Datalog" "'{head}' is not a DATALOG form - expected fact, rule, or query.")
(message datalog-unsafe-head-variable 5 "VLA-Datalog" "in the rule deriving '{predicate}', the variable '{var}' appears in the head but never in the body - DATALOG can't know what values it should take. Every head variable must also appear in at least one body predicate.")
(message datalog-arity-mismatch 5 "VLA-Datalog" "predicate '{predicate}' is used with {a} argument(s) in one place and {b} in another - every DATALOG predicate needs one fixed number of arguments everywhere it appears.")
(message datalog-ground-internal 5 "VLA-Datalog" "internal: the integer grounder was handed {detail} - OPTIMIZE builds these rules itself, so this is a Frazaro bug; please report it.")
(message datalog-round-ceiling 5 "VLA-Datalog" "this DATALOG program is still deriving new facts after {rounds} rounds, which is almost certainly a mistake rather than a very large answer - check for a rule whose recursion never narrows.")
(message datalog-query-unknown-predicate 5 "VLA-Datalog" "(query {predicate}) names a predicate with no facts, no rule, and no matching table - check the spelling, or that the table argument's name matches. {defined}")
(message datalog-unknown-predicate 5 "VLA-Datalog" "'{predicate}' is used in a rule, but nothing defines it: no (fact ...), no rule deriving it, and no table argument has that name - so every rule reading it would silently find nothing, and an empty answer would look like \"nothing matched\". Check the spelling, or that its table is passed to DATALOG and named to match. {defined}")
(message datalog-table-not-a-range 5 "VLA-Datalog" "every DATALOG table argument must be a cell range - pass a reference like Employees, not a computed value.")
(message datalog-table-needs-a-name 5 "VLA-Datalog" "this range has no name DATALOG can use as a predicate - make it an Excel Table (Ctrl+T) or give it a defined name, then reference that name in the formula.")
(message datalog-not-bad-shape 5 "VLA-Datalog" "(not ...) takes exactly one predicate form, like (not (excluded X)) - not zero, and not more than one.")
(message datalog-negation-unsafe-variable 5 "VLA-Datalog" "in '{predicate}' under (not ...), the variable '{var}' hasn't been given a value by any body predicate written before it - DATALOG can't evaluate a negation over a value it doesn't already know; move a predicate that binds '{var}' earlier in the rule's body.")
(message datalog-negation-not-stratifiable 5 "VLA-Datalog" "predicate '{predicate}' depends on itself through a (not ...), (count ...), (sum ...), or (textjoin ...) - directly, or through a chain of rules - and DATALOG requires every one of those to be safely stratifiable (the predicate being negated or aggregated must be fully known before the rule using it can run), so a cycle running back through one can't be evaluated.")
(message datalog-aggregate-bad-shape 5 "VLA-Datalog" "({form} ...) takes exactly a result variable then a predicate form, like ({form} N (weight X W)).")
(message datalog-aggregate-result-not-a-variable 5 "VLA-Datalog" "({form} ...)'s first argument must be a bare variable (a word starting with a capital letter) - the name that will hold the result, not the predicate itself.")
(message datalog-sum-needs-one-value-variable 5 "VLA-Datalog" "(sum ...) over '{predicate}' needs EXACTLY ONE argument left unbound (the value to add up) - found {count}. Bind every other argument to a variable from earlier in the body (the group), or a constant, and leave only the value column free.")
(message datalog-aggregate-result-reused 5 "VLA-Datalog" "'{var}' is already bound earlier in this rule's body - an aggregate's own result variable must be a brand-new name, not one already in use.")
(message datalog-table-noncontiguous-columns 5 "VLA-Datalog" "a table argument spanning multiple disjoint areas (a Ctrl-selected, non-contiguous range) isn't supported - select one contiguous block of the table's own columns instead.")
(message datalog-builtin-needs-two-operands 5 "VLA-Datalog" "'{operator}' needs exactly {expected}, like {example} - found {count}.")
(message datalog-builtin-unsafe-variable 5 "VLA-Datalog" "in '{operator}', the variable '{var}' hasn't been given a value by any body predicate written before it - a comparison, text test or arithmetic built-in can't evaluate a value it doesn't already know; move a predicate that binds '{var}' earlier in the rule's body.")
(message datalog-unknown-arithmetic-operator 5 "VLA-Datalog" "'{operator}' isn't one of DATALOG's own arithmetic built-ins - refused by name rather than guessed. The ones it knows are + - * / mod rem // min max ** abs sign sqrt truncate round ceiling floor.")
(message datalog-arithmetic-domain-error 5 "VLA-Datalog" "'{operator}' has no real answer for those operands - the square root of a negative, or a negative raised to a fractional power.")
(message datalog-arithmetic-overflow 5 "VLA-Datalog" "'{operator}' gives an answer larger than any number DATALOG can represent.")
(message datalog-let-bad-shape 5 "VLA-Datalog" "(let ...) takes exactly a result variable then an arithmetic expression, like (let Z (+ X Y)).")
(message datalog-let-result-not-a-variable 5 "VLA-Datalog" "(let ...)'s first argument must be a bare variable (a word starting with a capital letter) - the name that will hold the result, not the expression itself.")
(message datalog-let-result-reused 5 "VLA-Datalog" "'{var}' is already bound earlier in this rule's body - a (let ...) result variable must be a brand-new name, not one already in use.")
(message datalog-arithmetic-non-numeric-operand 5 "VLA-Datalog" "(let ...) using '{operator}' needs two numeric operands - at least one side wasn't a number.")
(message datalog-division-by-zero 5 "VLA-Datalog" "(let ...) using '/' would divide by zero.")
(message datalog-atom-mixed-keying 5 "VLA-Datalog" "'{predicate}' mixes keyed arguments like (column value) with plain positional ones in the same atom - key every argument by its own column name, or none of them.")
(message datalog-keyed-atom-needs-header 5 "VLA-Datalog" "'{predicate}' has no column headers to key against (it comes from a (fact ...) block, a plain named range, or a rule - none of those have column names) - use plain positional arguments instead, like ({predicate} X Y).")
(message datalog-unknown-column 5 "VLA-Datalog" "'{column}' isn't a column of '{predicate}' - its own columns are: {columns}.")
(message datalog-keyed-column-repeated 5 "VLA-Datalog" "'{column}' is keyed more than once in the same '{predicate}' atom - each column name may appear at most once per (predicate (col val) ...) form.")
(message datalog-text-test-name-reserved 5 "VLA-Datalog" "'{name}' is one of DATALOG's text tests - (text-starts-with Text Start), (text-ends-with Text End) and (text-contains Text Part) - so it can't name a relation, a fact or a table. Choose another name.")
(message datalog-text-test-in-query 5 "VLA-Datalog" "(query ({name} ...)) asks a text test on its own, and a text test is a condition inside a rule - write it there and query the rule, like (rule (answer X) (codes X) ({name} X \"GL-4\")) (query answer).")
(message datalog-textjoin-bad-shape 5 "VLA-Datalog" "(textjoin ...) takes exactly a result variable, a separator and a predicate form, like (textjoin Names \", \" (can-cover Name \"Night\")).")
(message datalog-textjoin-separator-not-text 5 "VLA-Datalog" "(textjoin ...)'s second argument is the separator, written out like \", \" - not a variable or a nested form.")
(message datalog-textjoin-needs-one-value-variable 5 "VLA-Datalog" "(textjoin ...) over '{predicate}' needs EXACTLY ONE argument left unbound (the value to join) - found {count}. Bind every other argument to a variable from earlier in the body (the group), or a constant, and leave only the value column free.")
(message datalog-textjoin-too-long-for-a-cell 5 "VLA-Datalog" "(textjoin ...) would put {length} characters into '{var}', and an Excel cell holds at most 32,767 - narrow the rule, or list the values as rows instead.")
(message datalog-prolog-goal 5 "VLA-Datalog" "'{name}' is one of PROLOG's goals, and nothing in this program defines it, so DATALOG can't read it: {hint}.")
(message relation-table-noncontiguous-areas 5 "VLA-Relation" "a table argument spanning multiple disjoint areas is not supported - select one contiguous block of the table's own columns instead.")
(message relation-table-is-an-error 5 "VLA-Relation" "a table argument is an error value, not a range. A reference ending in # (like N2#) gives #REF! when its cell is not spilling a table right now - check that cell shows its table, and not an error or a single value.")
(message relation-spill-needs-a-name 5 "VLA-Relation" "this spilled range has no name the rules can use for it. In Name Manager, add a name (for example Schedule) that refers to {refers}, then pass that name in the formula instead of the reference.")
(message relation-spill-two-names 5 "VLA-Relation" "this spilled range has more than one name ({names}), so it is not clear which one the rules mean - keep one of them in Name Manager.")
(message relation-spill-header-blank 5 "VLA-Relation" "a spilled range's first row is its headers, and cell {cell} is blank - every column needs a name there.")
(message relation-spill-header-not-text 5 "VLA-Relation" "a spilled range's first row is its headers, and cell {cell} holds a number, TRUE/FALSE or an error rather than a column name - that row looks like data. Spill a header row first, for example =VSTACK(HSTACK(\"Name\", \"Shift\"), ...).")
(message relation-spill-header-duplicate 5 "VLA-Relation" "a spilled range's first row is its headers, and cells {cells} hold the same name - give every column its own name.")
(message relation-table-reason-unknown 5 "VLA-Relation" "a table argument was refused for a reason ('{reason}') no refusal is written for - this is a Frazaro bug, please report it.")
(message sql-table-not-a-range 5 "VLA-Sql" "SQL's table argument must be a cell range - pass a reference like Employees, not a computed value.")
(message sql-table-noncontiguous-columns 5 "VLA-Sql" "a table argument spanning multiple disjoint areas (a Ctrl-selected, non-contiguous range) isn't supported - select one contiguous block of the table's own columns instead.")
(message sql-table-needs-a-name 5 "VLA-Sql" "this range has no name SQL can use as a table - make it an Excel Table (Ctrl+T) or give it a defined name, then reference that name in the formula.")
(message sql-table-needs-real-table 5 "VLA-Sql" "SQL needs a real Excel Table (select the range, Ctrl+T) so it has real column names to SELECT/WHERE by - a plain named range has no column names of its own.")
(message sql-needs-exactly-one-table 5 "VLA-Sql" "SQL takes exactly one table for now (found {count}) - multi-table queries (JOIN) aren't built yet.")
(message sql-from-table-mismatch 5 "VLA-Sql" "the query's own FROM {from} isn't among the table(s) actually passed to this call - FROM must name one of the passed table arguments, the same way a DATALOG rule must name its own table's real predicate.")
(message sql-unterminated-string 5 "VLA-Sql" "this query has a string literal that's never closed with a matching quote character.")
(message sql-unterminated-comment 5 "VLA-Sql" "this query has a /* block comment */ that's never closed with a matching */.")
(message sql-unexpected-character 5 "VLA-Sql" "'{char}' isn't a character SQL.1 recognizes anywhere in a query.")
(message sql-expected-token 5 "VLA-Sql" "expected {expected}, found {found}.")
(message sql-unsupported-keyword 5 "VLA-Sql" "'{keyword}' isn't part of SQL's own supported subset yet (SELECT DISTINCT/FROM/WHERE, AS, AND/OR/NOT, = <> < <= > >=, + - * /, parentheses) - it's refused by name rather than silently ignored or misread.")
(message sql-unknown-column 5 "VLA-Sql" "'{column}' isn't a column of any table this query reads - check the spelling against the table's own header row (or, once a JOIN is involved, qualify it as tablename.{column}).")
(message sql-computed-column-needs-alias 5 "VLA-Sql" "a computed SELECT expression needs its own alias (AS name) - only a bare column reference can be selected without one, since GROUP BY/ORDER BY and the output header both need a real name to refer back to.")
(message sql-arithmetic-non-numeric-operand 5 "VLA-Sql" "'{operator}' needs two numeric operands - at least one side wasn't a real number (a text column that merely looks numeric is never silently promoted).")
(message sql-division-by-zero 5 "VLA-Sql" "'/' would divide by zero.")
(message sql-arithmetic-domain-error 5 "VLA-Sql" "'{operator}' has no real answer for those operands - the square root of a negative, or a negative raised to a fractional power.")
(message sql-arithmetic-overflow 5 "VLA-Sql" "'{operator}' gives an answer larger than any number SQL can represent.")
(message sql-arithmetic-unknown-operator 5 "VLA-Sql" "'{operator}' isn't an arithmetic operator SQL can compute - refused by name rather than guessed.")
(message sql-scalar-function-arity 5 "VLA-Sql" "{function} takes exactly {expected}. ABS, SIGN, SQRT, TRUNCATE, FLOOR, CEILING and ROUND take one; MOD, REMAINDER, DIV, LEAST, GREATEST and POWER take two.")
(message sql-needs-at-least-one-table 5 "VLA-Sql" "SQL needs at least one table argument (found {count}).")
(message sql-join-table-not-passed 5 "VLA-Sql" "the query's own JOIN {table} isn't among the table(s) actually passed to this call.")
(message sql-duplicate-join-table 5 "VLA-Sql" "'{table}' is named more than once across FROM/JOIN - a self-join needs table aliasing (AS), which isn't supported yet.")
(message sql-outer-join-not-supported 5 "VLA-Sql" "'{keyword}' isn't supported yet - only INNER JOIN (or a bare JOIN, which means the same thing) is built so far; LEFT/RIGHT/FULL/OUTER/CROSS JOIN are refused by name rather than silently misread.")
(message sql-ambiguous-column 5 "VLA-Sql" "'{column}' exists in more than one joined table - qualify it (e.g. tablename.{column}) to say which one you mean.")
(message sql-aggregate-star-only-count 5 "VLA-Sql" "{function}(*) isn't allowed - only COUNT(*) may use '*' as its own argument; SUM/MIN/MAX/AVG need a real column or expression.")
(message sql-aggregate-nested 5 "VLA-Sql" "an aggregate function (COUNT/SUM/MIN/MAX/AVG) can't itself contain another aggregate call - aggregate over a plain column or expression instead.")
(message sql-aggregate-not-allowed-in-where 5 "VLA-Sql" "COUNT/SUM/MIN/MAX/AVG can't appear in WHERE - WHERE filters rows before grouping ever happens; filter on an aggregate's own result with HAVING instead.")
(message sql-aggregate-not-allowed-in-on 5 "VLA-Sql" "COUNT/SUM/MIN/MAX/AVG can't appear in a JOIN's own ON condition - ON filters rows before grouping ever happens; filter on an aggregate's own result with HAVING instead.")
(message sql-group-by-needs-column 5 "VLA-Sql" "GROUP BY needs a plain column reference (optionally qualified, like tablename.column) - a computed expression or an aggregate call isn't a valid GROUP BY item.")
(message sql-aggregate-select-star-not-allowed 5 "VLA-Sql" "SELECT * can't be combined with GROUP BY or an aggregate function - name the columns/aggregates actually wanted instead.")
(message sql-select-item-not-grouped 5 "VLA-Sql" "SELECT item #{position} is neither a GROUP BY column nor wrapped in an aggregate (COUNT/SUM/MIN/MAX/AVG) - once a query groups or aggregates, every OTHER SELECT item must be one or the other.")
(message sql-aggregate-non-numeric-operand 5 "VLA-Sql" "{function} needs a numeric operand - at least one grouped value wasn't a real number (a text column that merely looks numeric is never silently promoted).")
(message sql-aggregate-empty-no-rows 5 "VLA-Sql" "{function} over zero matching rows has no defined answer (unlike COUNT/SUM, which are 0 there) - the query matched no rows, and with no GROUP BY there's no group for {function} to summarize.")
(message sql-order-by-invalid-position 5 "VLA-Sql" "ORDER BY position '{value}' isn't valid - a 1-based output position must be a positive whole number.")
(message sql-order-by-position-out-of-range 5 "VLA-Sql" "ORDER BY {position} is out of range - this query's own SELECT list only has {count} output column(s).")
(message sql-order-by-unknown-column 5 "VLA-Sql" "ORDER BY '{column}' isn't one of this query's own output columns - order by a SELECT-list column's own name/alias, or its 1-based position.")
(message sql-order-by-ambiguous-column 5 "VLA-Sql" "ORDER BY '{column}' matches more than one output column - use its 1-based position instead to say which one you mean.")
(message sql-limit-needs-nonneg-integer 5 "VLA-Sql" "LIMIT '{value}' isn't a valid row count - it must be a non-negative whole number.")
(message sql-set-op-column-mismatch 5 "VLA-Sql" "{operator}'s two sides SELECT a different number of columns - the left side has {left}, the right side has {right}; only the column COUNT has to match, never the names or types, but it does have to match.")
(message sql-cte-unterminated-definition 5 "VLA-Sql" "a WITH clause's own '(' definition is never closed with a matching ')'.")
(message sql-cte-duplicate-name 5 "VLA-Sql" "'{name}' is named more than once in the same WITH clause - each CTE needs its own distinct name.")
(message sql-cte-self-reference-needs-recursive 5 "VLA-Sql" "'{name}' references itself inside its own definition, but this WITH clause doesn't say RECURSIVE - add WITH RECURSIVE if a self-referencing CTE is really what's wanted.")
(message sql-cte-recursive-shape 5 "VLA-Sql" "'{name}' is marked RECURSIVE (or references itself) but doesn't match the one shape this engine supports - exactly `base UNION ALL step`, with neither side itself a further UNION/INTERSECT/EXCEPT/UNION ALL, and the self-reference only in the step (the second) side.")
(message sql-cte-recursive-base-self-references 5 "VLA-Sql" "'{name}''s own base (the FIRST side of its UNION ALL) references '{name}' itself - the base case must be non-recursive; only the step (the second side) may reference the CTE being defined.")
(message sql-cte-recursive-step-single-reference 5 "VLA-Sql" "'{name}''s own step references '{name}' more than once (e.g. joining the recursive CTE against itself) - not supported; a recursive step may reference the CTE being defined exactly once.")
(message sql-cte-recursive-no-order-by-limit 5 "VLA-Sql" "'{name}' is a recursive CTE and can't have its own ORDER BY/LIMIT inside its own definition - per-round ordering has no defined meaning here; ORDER BY/LIMIT the query that USES '{name}' instead.")
(message sql-cte-round-ceiling 5 "VLA-Sql" "'{name}' didn't converge within {rounds} rounds - a self-referencing step over data with a cycle can keep producing new rows forever; check whether '{name}''s own step is really supposed to still be finding new rows this far in.")
(message sql-internal-aggregate-unregistered 5 "VLA-Sql" "internal: aggregate '{key}' not registered in the grouped colMap")
(message sql-internal-scalar-node-shape 5 "VLA-Sql" "internal: EvalScalar called on a non-scalar AST node")
(message sql-internal-bool-node-shape 5 "VLA-Sql" "internal: EvalBool called on a non-boolean AST node")
(message optimize-choose-bare 5 "VLA-Optimize" "'choose' on its own does not say how many to choose - write choose-exactly, choose-at-least, choose-at-most, choose-between, or choose-any (each pool row in or out). One word per meaning, so a message can name the whole thing.")
(message optimize-unknown-top-form 5 "VLA-Optimize" "'{head}' is not an OPTIMIZE form - expected fact, rule or query, or one of choose-exactly, choose-at-least, choose-at-most, choose-between, choose-any, require, forbid, prefer, avoid, minimize, maximize, fewest-changes-from or effort.")
(message optimize-form-bad-shape 5 "VLA-Optimize" "({form} ...) is written wrong: it needs {expected}. For example {example}.")
(message optimize-count-not-a-number 5 "VLA-Optimize" "({form} ...) needs a count first, and '{count}' is neither a whole number of zero or more nor a name. Write the number, or a name a (per ...) row binds - for example (choose-exactly N (assign S P) (Eligible S P) (per (Shifts S N))), where every shift's own N comes from the Shifts table.")
(message optimize-choose-range-inverted 5 "VLA-Optimize" "choose-between {low} and {high} asks for at least {low} and at most {high}, which nothing can satisfy - write the smaller number first.")
(message optimize-not-a-row 5 "VLA-Optimize" "({form} ...) expects a row for {role}, and '{text}' is not one. A row is written like (assign Shift Person) - a name, then what it is about.")
(message optimize-effort-unknown-level 5 "VLA-Optimize" "'{level}' is not an effort level - write quick, normal or thorough, or a whole number of units of work greater than none. Effort is counted in WORK and never in seconds, so the same workbook answers the same on a fast machine and a slow one.")
(message optimize-reserved-predicate 5 "VLA-Optimize" "'{name}' starts with '{prefix}', which Frazaro keeps for the names it writes itself - OPTIMIZE turns each of your rules into one, so a name of your own that started the same way could quietly collect your rows alongside its own. Rename it to anything that does not begin '{prefix}'. An Excel Table cannot be named with a hyphen, so no table argument is affected.")
(message optimize-require-unbound-consequent 5 "VLA-Optimize" "(require ({predicate} ...) ...) says '{predicate}' must hold wherever the rest holds, and '{var}' appears only in '{predicate}' - nothing else in the rule says which row it is. So this is asking whether SOME row exists, which is a question a rule answers, not a requirement. Write the rule first and require its head: (rule (has-senior S) (assign S P) (senior P)), then (require (has-senior S) (night S)).")
(message optimize-require-consequent-not-a-row 5 "VLA-Optimize" "(require ...) needs a row first - what must be true - and '{word}' is a test rather than a row. A test belongs in the part that follows, which says when the requirement applies, or in a (forbid ...), which says what may never all hold at once. For example (require (senior P) (reviews T P)), or (forbid (holds P T) (count N (holds P T2)) (> N 2)).")
(message optimize-preference-not-yet 5 "VLA-Optimize" "({form} ...) says what a good answer looks like, and this version does not weigh one answer against another yet: it gives the first answer that breaks no rule, deciding the rows in the order your Tables list them. Remove it for that answer.")
(message optimize-objective-not-yet 5 "VLA-Optimize" "({form} ...) names what to make as small or as large as possible, and this version does not compare one answer with another yet: it gives the first answer that breaks no rule, deciding the rows in the order your Tables list them. Remove it for that answer.")
(message optimize-kept-not-yet 5 "VLA-Optimize" "({form} ...) names a schedule to stay close to, and this version does not measure an answer against another yet: it gives the first answer that breaks no rule, deciding the rows in the order your Tables list them. Remove it for that answer.")
(message optimize-recursion-through-choices 5 "VLA-Optimize" "the rule for '{predicate}' reads rows that are themselves being chosen, and calls itself - so an answer could support itself, which this version will not accept. Rules over the DATA may recurse freely (who reports to Alice, directly or not); only recursion through a CHOICE is refused. Nothing changes about what a rule means: the same rule will answer, unchanged, when this is built.")
(message optimize-unknown-result-state 5 "VLA-Optimize" "internal: result state {state} is not one of the five OPTIMIZE reserves - this is a Frazaro bug, please report it.")
(message optimize-chosen-is-defined 5 "VLA-Optimize" "'{name}' is being chosen, and the program also gives it rows, as {how} - a row cannot be both given and chosen. Choose into a name the program defines nowhere else, the way assign is chosen in (choose-exactly 2 (assign S P) (eligible S P) (per (shifts S))).")
(message optimize-chosen-arity 5 "VLA-Optimize" "'{name}' is chosen with {arity} names after it in ({form} ...), and with {other} by an earlier choice form - every form choosing the same rows must agree on how many names a row has.")
(message optimize-rule-over-choice-not-yet 5 "VLA-Optimize" "the rule for '{predicate}' reads '{chosen}', which is being chosen, and this version answers rules over the data, not over the choices, yet. A condition on chosen rows can be written as a (forbid ...) or a (require ...), which may read them: for example (forbid (assign S P) (assign T P) (next S T)).")
(message optimize-pool-reads-choice 5 "VLA-Optimize" "({form} ...) chooses from '{name}', which is itself being chosen - a pool, and the rows a (per ...) groups by, must be rows the program already has: a Table, a fact, or a rule over them.")
(message optimize-count-over-choice-not-yet 5 "VLA-Optimize" "a ({word} ...) in a rule counts rows of '{chosen}', which are still being chosen, and this version cannot count what it has not decided yet. A limit on how many is a second choice form over the same rows, which is kept as the rows are chosen: for example (choose-at-most 5 (assign S P) (week-eligible S P W) (per (person-week P W))).")
(message optimize-choice-unbound 5 "VLA-Optimize" "({form} ...) chooses rows with '{var}' in them, and neither the pool nor the (per ...) says what '{var}' is - so there is no end to the rows it could mean. Name '{var}' in the pool or in a (per ...) row.")
(message optimize-count-unbound 5 "VLA-Optimize" "({form} ...) takes its count from '{var}', and no (per ...) row names '{var}' - a count read from a Table comes from the row it counts for, like N in (per (shifts S N)).")
(message optimize-count-bad-value 5 "VLA-Optimize" "({form} ...) takes its count from '{var}', and for {group} it is '{value}', which is not a whole number of zero or more.")
(message optimize-negated-choice-unbound 5 "VLA-Optimize" "a rule says a '{predicate}' row is not chosen, and '{var}' in that row appears nowhere else in the rule - so it asks about every possible '{var}' at once. Name '{var}' in a row the rule already reads.")
(message optimize-effort-twice 5 "VLA-Optimize" "this program says (effort ...) twice - write it once, so there is one answer to how much work the search may do.")
(message optimize-effort-too-large 5 "VLA-Optimize" "'{level}' is more work than one search may be given - at most 2147483647 units, each a decision or a dead end. Effort is counted in WORK and never in seconds, so the same workbook answers the same on a fast machine and a slow one.")
(message optimize-internal 5 "VLA-Optimize" "internal: OPTIMIZE {detail} - this is a Frazaro bug; please report it.")
(message optimize-choice-too-large 5 "VLA-Optimize" "{form} has more rows to choose from than {who} lays out in one step: {why}, and {who} lays out at most {ceiling}. Choose from a smaller pool - a rule that keeps only the rows that could really be chosen.{then}")
(message optimize-rule-too-large 5 "VLA-Optimize" "{form} pairs more rows than {who} lays out in one step: {why}, and {who} lays out at most {ceiling}. A condition that ties its rows together pairs fewer, and so does a smaller pool.{then}")
(message optimize-too-large 5 "VLA-Optimize" "this program lays out more rows than {who} may: with {form}, its choices and the rules over them reach {rows} rows, and {who} lays out at most {ceiling} in all. Smaller pools, or rules that pair fewer rows, lay out less.{then}")
(message optimize-command-no-cell 5 "VLA-Optimize" "select the cell that holds the =OPTIMIZE(...) formula first - what is selected now is {what}, not a cell.")
(message optimize-command-one-cell 5 "VLA-Optimize" "the command runs one cell's OPTIMIZE formula, and {range} is {count} cells - choose just the cell that holds it.")
(message optimize-command-no-formula 5 "VLA-Optimize" "{cell} has no OPTIMIZE formula to run as a command: {why}. The command runs a cell whose whole formula is one call to OPTIMIZE, OPTIMISE, OPTIMIZE_STATUS or OPTIMIZE_VIOLATIONS.")
(message optimize-command-argument 5 "VLA-Optimize" "the command could not read {cell}'s {which}, {arg}: {why}.")
(message optimize-command-stopped 5 "VLA-Optimize" "the command running {cell} was stopped by Esc, and nothing was written.")
(message optimize-command-failed 5 "VLA-Optimize" "the command could not run {cell}: {detail}")
(message optimize-table-not-a-range 5 "VLA-Optimize" "every OPTIMIZE table argument must be a cell range - pass a reference like Employees, not a computed value.")
(message optimize-table-needs-a-name 5 "VLA-Optimize" "this range has no name OPTIMIZE can use for it - make it an Excel Table (Ctrl+T) or give it a defined name, then reference that name in the formula.")
(message optimize-table-noncontiguous-columns 5 "VLA-Optimize" "a table argument spanning multiple disjoint areas (a Ctrl-selected, non-contiguous range) isn't supported - select one contiguous block of the table's own columns instead.")
(message cli-history-empty 5 "VLA-Console" "There is no entry {n} to bring back: nothing has been kept in this console's history yet. Every command run here is kept, even one that is refused, and typing history lists them with their numbers.")
(message cli-history-no-such-entry 5 "VLA-Console" "There is no entry {n} in this console's history - it holds entries {first} to {last}. Type history to see them with their numbers, then ! and one of those numbers, like !{last}, to bring that command back.")
(message build-output-exists 58 "VLA-Build" "Refusing to write {path}: a file is already there, and it has not been changed. Add --replace to replace it, or name another file with --out.")
(message build-workbook-too-large 7 "VLA-Build" "The workbook would not fit its file format: a part, or the whole, is over 4 GB. Nothing was written.")
(message build-not-representable 17 "VLA-Build" "frazaro build writes only what a sheet can hold with nothing running: a value or a formula into a cell, a range or rows of a column, and which sheet it goes on. Line {line} asks for more: {sentence} Nothing was written; run the program with the add-in, or take the sentence out.")
(message build-sheet-unknown 9 "VLA-Build" "Line {line} names sheet {name}, but nothing before it has made that sheet. Write Work on sheet {name}. first, which makes the sheet when it is missing. Nothing was written.")
(message build-sheet-name-invalid 1004 "VLA-Build" "Line {line} names sheet {name}, which Excel would refuse: {reason}. A sheet name is 1 to 31 characters, holds none of : \\ / ? * [ ], and does not begin or end with an apostrophe. Nothing was written.")
(message rebuild-not-a-build 5 "VLA-Build" "This workbook cannot be verified as a Frazaro build: {why}. frazaro rebuild checks a workbook that frazaro build wrote and nothing has saved since.")
(message build-into-not-a-workbook 5 "VLA-Build" "{path} is not a workbook frazaro build can add sheets to: {why}. Nothing was written.")
(message build-into-unsupported 5 "VLA-Build" "{path} has a part this version does not know how to edit: {part}, {why}. Nothing was written.")
(message build-into-model-sheet 5 "VLA-Build" "Line {line} writes into sheet {name}, which belongs to the workbook the build adds to, and the build leaves that workbook's own sheets as they are. Write to a sheet of the program's own (Work on sheet Results.) and read the model's cells from there. Nothing was written.")
(message build-into-sheet-name-taken 5 "VLA-Build" "{path} already has a sheet named {name}, and the build needs that name for the sheet that holds the sentences. Rename that sheet, or build into a copy without it. Nothing was written.")
(message build-formula-egress 5 "VLA-Build" "Line {line} would write a formula that uses {name}, which can reach outside the workbook on its own (the network, another program, or a link to one), and Frazaro never writes one: {sentence} Nothing was written.")
(message reflect-not-a-workbook 5 "VLA-Reflect" "{path} is not a workbook frazaro reflect can read: {why}.")
(message reflect-xml-refused 5 "VLA-Reflect" "{path} has a part this version refuses to read: {part}, {why}. Nothing past that point was read.")
(message reflect-unsupported 5 "VLA-Reflect" "{path} has a shape this version does not read: {part}, {why}.")
(message distro-manifest-missing 53 "VLA-Distro" "There is no distro named {edition}: {path} is not there. A distro is a folder holding a distro.vla that names its prelude and its phrasebooks; distros\\english\\README.md shows the shape.")
(message distro-manifest-invalid 5 "VLA-Distro" "{path} is not a distro manifest this version can read: {why}. The shape is distros\\english\\README.md's: one (distro \"name\" ...) form, one directive a line, every path relative to the folder with forward slashes.")