Jürgen/List
I have been thinking about your comments on UTF8 combine underline. The
UTF8 standard is clear -- U0332 combines with the previous character.
Any other behaviour is an error.
I like having the ability to underline. This adds 62 (a..z, A..Z, 0..9
underlined, and neg etc. underlined, which I am ignoring) characters to
the namespace. So, I replaced {quad}af DF (UPPER_HALF_BLOCK) with the
combining underline. This will be utterly benign to most (all)
applications, except for (maybe) some character terminal plotting. The
remaining problem is that combining underline can *start* a symbol,
which is a bit wrong. I didn't bother fixing the tokenizer -- just
Avec.def. Find attached. Note that the combining underline can be
replaced with underline for export compatibility with other APL
implementations -- if needed (perhaps an option on ATF export?). I
wouldn't need that, but, just an idea.
I do not call APL from within emacs (or vi). I use my own editor
instead. I have also attached xed.apl (for consideration in
bits&pieces). That calls out to an external editor to edit functions.
The function xeda edits matrices, calling out to libreoffice to provide
gui editing. Both of these need some, um..., tender loving care, but
they do work for me. I write functions in the workspace interactively,
generate data, and test -- then call from another application using
libapl. xed and xeda are appropriate for my workflow, and may help (but
probably too trivial to be of much interest, I imagine).
Fred Weigel
#!/usr/local/bin/apl --script
⍝
⍝ These functions are written as a sample extension of the Toronto
⍝ Toolkit. "explain 'xed'" will work, as will "comments 'xed'".
⍝ 'xed', 'xeda' and 'cr2lf' are added to toolkitlist, but only if the
⍝ toolkit is present. So, use ")copy 1 toolkit" before ")copy 1 xed"
⍝ for proper integration with the toolkit.
⍝
⍝ xed is set to call up my "e" editor, which is a terminal application.
⍝ It launches xterm to run a new terminal with the editor. This is done
⍝ because )host doesn't restore terminal settings before running its
⍝ given command.
⍝
⍝ As well, "explain 'del'" will provide a reminder of the features of
⍝ the del editor in GNU APL. (I ⍝ used del until xed itself was
⍝ operational).
⍝
⍝ 'xeda array' edits an array by converting to csv, and using an
⍝ external editor (libreoffice calc). It returns the edited array.
⍝ It uses CSV to convert the array to a CSV, libreoffice calc to edit
⍝ the array, and CSV to read it in again. The CSV library brings in
⍝ FILE_IO, which is also needed.
⍝
⍝ )COPY 5 FILE_IO
)COPY 1 CSV
g∆nl ← ⎕UCS 10
g∆tmp ← '/tmp/'
g∆editor ← 'e '
g∆editorcsv ← 'oocalc '
g∆terminal ← 'xterm -xrm XTerm.vt100.initialFont:6 -e '
'→' ⎕EA 'toolkitlist ← toolkitlist on ''xed'''
'→' ⎕EA 'toolkitlist ← toolkitlist on ''xeda'''
'→' ⎕EA 'toolkitlist ← toolkitlist on ''cr2lf'''
∇r←cr2lf s
⍝convert CR to LF in string <s>
⍝.k text-editing
⍝.n fmgw
⍝.t 2015.8.5.10.33.0
⍝.v 1.0 / 05aug15
r←s
r[(s = ⎕UCS 13)/(⍳⍴s)]←g∆nl
∇
∇del
⍝describe 'del' editor usage
⍝.k text-editing
⍝.n fmgw
⍝.t 2015.8.5.10.33.0
⍝.v 1.0 / 05aug15
'Enter: explain ''del'''
'for a brief explanation of the ∇ editor and its use with GNU APL.'
∇
howcr2lf←'DOS (and APL2) used ASCII CR (carrier return, 13)'
howcr2lf←howcr2lf, ' to separate lines.', g∆nl
howcr2lf←howcr2lf, 'Linux (GNU APL) uses ASCII LF (line feed, 10)'
howcr2lf←howcr2lf, ' for this function.', g∆nl
howcr2lf←howcr2lf, 'cr2lf converts any CR characters in a string'
howcr2lf←howcr2lf, ' to LF characters.'
howdel←'Help for GNU APL built-in del (∇) editor', g∆nl, g∆nl
howdel←howdel, '∇FUN open function FUN', g∆nl
howdel←howdel, '∇FUN[⎕] open with command, ∆ and → not'
howdel←howdel, ' allowed', g∆nl
howdel←howdel, '∇FUN[⎕]∇ open, list, close', g∆nl, g∆nl
howdel←howdel, '∇ close', g∆nl
howdel←howdel, '⍫ close and lock', g∆nl, g∆nl
howdel←howdel, '[⎕] show [⎕] [n⎕] [⎕m] [n⎕m] [⎕n-m]'
howdel←howdel, g∆nl
howdel←howdel, '[∆] delete [n∆] [∆m] [n∆m] [∆n-m]'
howdel←howdel, ' [∆n1 n2 ...]', g∆nl
howdel←howdel, '[→] escape (clear definition, keep'
howdel←howdel, ' header)', g∆nl
howdel←howdel, '[n] goto', g∆nl
howdel←howdel, '[n] text replace existing text on line n'
howdel←howdel, g∆nl
howdel←howdel, ' text replace existing text', g∆nl, g∆nl
howdel←howdel, 'After opening function, up and down arrows will'
howdel←howdel, ' retrieve function', g∆nl
howdel←howdel, '^K - kill to end of line, ^Y yank, ^A/^E, ^N/^P (can'
howdel←howdel, ' retrieve input', g∆nl
howdel←howdel, 'line, ^K, define a function, then ^Y).'
howxed←'xed ''function''. Edits function by calling out to an external'
howxed←howxed, ' editor.', g∆nl
howxed←howxed, 'Uses globals g∆nl, g∆tmp, g∆editor and g∆terminal.'
howxeda←'r ← xed a. Edits array by calling out to an external'
howxeda←howxeda, ' editor.', g∆nl
howxeda←howxeda, 'Uses globals g∆nl, g∆tmp and g∆editorcsv.'
∇xed f;fn;s;r;cmd;h;n;q;⎕IO
⍝edit function <f> with external editor
⍝.k text-editing
⍝.n fmgw
⍝.t 2015.8.5.11.0.0
⍝.v 1.0 /05aug15
⎕IO ← 1
q ← '"'
⍝
⍝ Convert function to del edit sequence, with lines separated
⍝ by unix newlines.
⍝
s ← ⎕CR f
s ← ,(' ', s[⍳(⍴s)[1];], g∆nl)
s[1] ← '∇'
s ← s, '∇'
⍝
⍝ Write out character string representing function to ./function.APL
⍝ file. Prepend line to indicate that this is a "dump" format.
⍝
fn ← g∆tmp, f, '.APL'
h ← 'w' FIO∆fopen fn
n ← ('#!/usr/local/bin/apl --script', g∆nl) FIO∆fwrite_utf8 h
n ← s FIO∆fwrite_utf8 h
r ← FIO∆fclose h
⍝
⍝ Call external editor on file. Use terminal because APL messes with
⍝ terminal control.
⍝
cmd ← g∆terminal, q, g∆editor, fn, q
r ← ⍎')host ', cmd
⍝
⍝ No convenient way to read utf-8 string. Could read file as byte
⍝ vector and then use ⎕CR to convert... but, easier to "dress up" the
⍝ function as a del editor definition, and use ")copy" to bring it back
⍝ in. Note that we add the directory to fn, to allow this to work in
⍝ other than workspaces/.
⍝
r ← ⍎')copy ', fn
⍝
⍝ We could erase the external edit file, and backup. Keep these around
⍝ for now. The new function is in ./fn.APL, the original in
⍝ ./fn.APL.bak
⍝
⍝ r ← ⍎')host rm ', fn, ' ', fn, '.bak'
∇
∇ra ← xeda a;fn;s;cmd;h;n;⎕IO
⍝edit array <a> with external editor
⍝.k text-editing
⍝.n fmgw
⍝.t 2015.8.7.20.40.0
⍝.v 1.0 / 07aug15
⎕IO ← 1
⍝
⍝ Convert array to edit sequence, with lines separated
⍝ by unix newlines.
⍝
s ← ',' make∆csv a
s ← ,(s[⍳(⍴s)[1];], g∆nl)
⍝
⍝ Write out character string representing array to ./ARRAY.csv
⍝ file.
⍝
fn ← g∆tmp, 'ARRAY.csv'
h ← 'w' FIO∆fopen fn
n ← s FIO∆fwrite_utf8 h
r ← FIO∆fclose h
⍝
⍝ Call external editor on file. Doesn't use a terminal, because CSV
⍝ editor is a GUI application.
⍝
cmd ← g∆editorcsv, fn
r ← ⍎')host ', cmd
⍝
⍝ Read in resulting CSV file.
⍝
ra ← ',' read∆csvfile fn
⍝
⍝ We could erase the external edit file, and backup.
⍝
⍝ r ← ⍎')host rm ', fn, ' ', fn, '.bak'
∇
/*
This file is part of GNU APL, a free implementation of the
ISO/IEC Standard 13751, "Programming Language APL, Extended"
Copyright (C) 2008-2015 Dr. Jürgen Sauermann
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/** The Unicode characters used in the interpreter.
Characters defined with char_def( , xxx) are contained in ⎕AV
Characters defined with char_def( , 0xx) are in ⎕AV without APL relevance
Characters defined with char_df1() are known in the source code but are
not contained in ⎕AV.
**/
//FMGW -- this table must be sorted by Unicode -- binary search is
// done for Unicode.
//We should add lambda and combining _ to keyboard map.
// Name Unicode Token Flags Pos
//-------------------------------------------------------------------
char_def(ASCII_NUL , 0x00 , END , NONE , 00)
char_def(ASCII_SOH , 0x01 , END , NONE , 01)
char_def(ASCII_STX , 0x02 , END , NONE , 02)
char_def(ASCII_ETX , 0x03 , END , NONE , 03)
char_def(ASCII_EOT , 0x04 , END , NONE , 04)
char_def(ASCII_ENQ , 0x05 , END , NONE , 05)
char_def(ASCII_ACK , 0x06 , END , NONE , 06)
char_def(ASCII_BEL , 0x07 , END , NONE , 07)
char_def(ASCII_BS , 0x08 , END , NONE , 08)
char_def(ASCII_HT , 0x09 , SPACE , NONE , 09)
char_def(ASCII_LF , 0x0A , NEWLINE , NONE , 0A)
char_def(ASCII_VT , 0x0B , END , NONE , 0B)
char_def(ASCII_FF , 0x0C , END , NONE , 0C)
char_def(ASCII_CR , 0x0D , SPACE , NONE , 0D)
char_def(ASCII_SO , 0x0E , END , NONE , 0E)
char_def(ASCII_SI , 0x0F , END , NONE , 0F)
char_def(ASCII_DLE , 0x10 , END , NONE , 10)
char_def(ASCII_DC1 , 0x11 , END , NONE , 11)
char_def(ASCII_DC2 , 0x12 , END , NONE , 12)
char_def(ASCII_DC3 , 0x13 , END , NONE , 13)
char_def(ASCII_DC4 , 0x14 , END , NONE , 14)
char_def(ASCII_NAK , 0x15 , END , NONE , 15)
char_def(ASCII_SYN , 0x16 , END , NONE , 16)
char_def(ASCII_ETB , 0x17 , END , NONE , 17)
char_def(ASCII_CAN , 0x18 , END , NONE , 18)
char_def(ASCII_EM , 0x19 , END , NONE , 19)
char_def(ASCII_SUB , 0x1A , END , NONE , 1A)
char_def(ASCII_ESC , 0x1B , END , NONE , 1B)
char_def(ASCII_FS , 0x1C , END , NONE , 1C)
char_def(ASCII_GS , 0x1D , END , NONE , 1D)
char_def(ASCII_RS , 0x1E , END , NONE , 1E)
char_def(ASCII_US , 0x1F , END , NONE , 1F)
char_def(ASCII_SPACE , ' ' , SPACE , NO_SPACE , 20)
char_def(ASCII_EXCLAM , '!' , F12_BINOM , NO_SPACE , 21)
char_def(ASCII_DOUBLE_QUOTE , '"' , QUOTE2 , NONE , 22)
char_def(ASCII_NUMBER_SIGN , '#' , END , NONE , 23)
char_def(ASCII_DOLLAR_SIGN , '$' , END , NONE , 24)
char_def(ASCII_PERCENT , '%' , END , NONE , 25)
char_def(ASCII_AMPERSAND , '&' , END , NONE , 26)
char_def(SINGLE_QUOTE , '\'' , QUOTE1 , NONE , 27)
char_def(ASCII_L_PARENT , '(' , L_PARENT , NO_SPACE , 28)
char_def(ASCII_R_PARENT , ')' , R_PARENT , NO_SPACE , 29)
char_def(ASCII_ASTERISK , '*' , F12_POWER , NO_SPACE , 2A)
char_def(ASCII_PLUS , '+' , F12_PLUS , NO_SPACE , 2B)
char_def(ASCII_COMMA , ',' , F12_COMMA , NO_SPACE , 2C)
char_def(ASCII_MINUS , '-' , F12_MINUS , NO_SPACE , 2D)
char_def(ASCII_FULLSTOP , '.' , OPER2_INNER , NO_SPACE , 2E)
char_def(ASCII_SLASH , '/' , OPER1_REDUCE , NO_SPACE , 2F)
char_def(ASCII_0 , '0' , NUMERIC , NUMERIC , 30)
char_def(ASCII_1 , '1' , NUMERIC , NUMERIC , 31)
char_def(ASCII_2 , '2' , NUMERIC , NUMERIC , 32)
char_def(ASCII_3 , '3' , NUMERIC , NUMERIC , 33)
char_def(ASCII_4 , '4' , NUMERIC , NUMERIC , 34)
char_def(ASCII_5 , '5' , NUMERIC , NUMERIC , 35)
char_def(ASCII_6 , '6' , NUMERIC , NUMERIC , 36)
char_def(ASCII_7 , '7' , NUMERIC , NUMERIC , 37)
char_def(ASCII_8 , '8' , NUMERIC , NUMERIC , 38)
char_def(ASCII_9 , '9' , NUMERIC , NUMERIC , 39)
char_def(ASCII_COLON , ':' , COLON , NO_SPACE , 3A)
char_def(ASCII_SEMICOLON , ';' , SEMICOL , NO_SPACE , 3B)
char_def(ASCII_LESS , '<' , F2_LESS , NO_SPACE , 3C)
char_def(ASCII_EQUAL , '=' , F2_EQUAL , NO_SPACE , 3D)
char_def(ASCII_GREATER , '>' , F2_GREATER , NO_SPACE , 3E)
char_def(ASCII_QUESTION , '?' , F12_ROLL , NO_SPACE , 3F)
char_def(ASCII_AT_SIGN , '@' , END , NO_SPACE , 40)
char_def(ASCII_A , 'A' , SYMBOL , SYMBOL , 41)
char_def(ASCII_B , 'B' , SYMBOL , SYMBOL , 42)
char_def(ASCII_C , 'C' , SYMBOL , SYMBOL , 43)
char_def(ASCII_D , 'D' , SYMBOL , SYMBOL , 44)
char_def(ASCII_E , 'E' , SYMBOL , SYMBOL , 45)
char_def(ASCII_F , 'F' , SYMBOL , SYMBOL , 46)
char_def(ASCII_G , 'G' , SYMBOL , SYMBOL , 47)
char_def(ASCII_H , 'H' , SYMBOL , SYMBOL , 48)
char_def(ASCII_I , 'I' , SYMBOL , SYMBOL , 49)
char_def(ASCII_J , 'J' , SYMBOL , SYMBOL , 4A)
char_def(ASCII_K , 'K' , SYMBOL , SYMBOL , 4B)
char_def(ASCII_L , 'L' , SYMBOL , SYMBOL , 4C)
char_def(ASCII_M , 'M' , SYMBOL , SYMBOL , 4D)
char_def(ASCII_N , 'N' , SYMBOL , SYMBOL , 4E)
char_def(ASCII_O , 'O' , SYMBOL , SYMBOL , 4F)
char_def(ASCII_P , 'P' , SYMBOL , SYMBOL , 50)
char_def(ASCII_Q , 'Q' , SYMBOL , SYMBOL , 51)
char_def(ASCII_R , 'R' , SYMBOL , SYMBOL , 52)
char_def(ASCII_S , 'S' , SYMBOL , SYMBOL , 53)
char_def(ASCII_T , 'T' , SYMBOL , SYMBOL , 54)
char_def(ASCII_U , 'U' , SYMBOL , SYMBOL , 55)
char_def(ASCII_V , 'V' , SYMBOL , SYMBOL , 56)
char_def(ASCII_W , 'W' , SYMBOL , SYMBOL , 57)
char_def(ASCII_X , 'X' , SYMBOL , SYMBOL , 58)
char_def(ASCII_Y , 'Y' , SYMBOL , SYMBOL , 59)
char_def(ASCII_Z , 'Z' , SYMBOL , SYMBOL , 5A)
char_def(ASCII_L_BRACK , '[' , L_BRACK , NO_SPACE , 5B)
char_def(ASCII_BACKSLASH , '\\' , OPER1_SCAN , NO_SPACE , 5C)
char_def(ASCII_R_BRACK , ']' , R_BRACK , NO_SPACE , 5D)
char_def(ASCII_CIRCUMFLEX , '^' , F2_AND , NO_SPACE , 5E)
char_def(ASCII_UNDERSCORE , '_' , SYMBOL , SYMBOL , 5F)
char_def(ACCENT_GRAVE , '`' , END , NO_SPACE , 60)
char_def(ASCII_a , 'a' , SYMBOL , SYMBOL , 61)
char_def(ASCII_b , 'b' , SYMBOL , SYMBOL , 62)
char_def(ASCII_c , 'c' , SYMBOL , SYMBOL , 63)
char_def(ASCII_d , 'd' , SYMBOL , SYMBOL , 64)
char_def(ASCII_e , 'e' , SYMBOL , SYMBOL , 65)
char_def(ASCII_f , 'f' , SYMBOL , SYMBOL , 66)
char_def(ASCII_g , 'g' , SYMBOL , SYMBOL , 67)
char_def(ASCII_h , 'h' , SYMBOL , SYMBOL , 68)
char_def(ASCII_i , 'i' , SYMBOL , SYMBOL , 69)
char_def(ASCII_j , 'j' , SYMBOL , SYMBOL , 6A)
char_def(ASCII_k , 'k' , SYMBOL , SYMBOL , 6B)
char_def(ASCII_l , 'l' , SYMBOL , SYMBOL , 6C)
char_def(ASCII_m , 'm' , SYMBOL , SYMBOL , 6D)
char_def(ASCII_n , 'n' , SYMBOL , SYMBOL , 6E)
char_def(ASCII_o , 'o' , SYMBOL , SYMBOL , 6F)
char_def(ASCII_p , 'p' , SYMBOL , SYMBOL , 70)
char_def(ASCII_q , 'q' , SYMBOL , SYMBOL , 71)
char_def(ASCII_r , 'r' , SYMBOL , SYMBOL , 72)
char_def(ASCII_s , 's' , SYMBOL , SYMBOL , 73)
char_def(ASCII_t , 't' , SYMBOL , SYMBOL , 74)
char_def(ASCII_u , 'u' , SYMBOL , SYMBOL , 75)
char_def(ASCII_v , 'v' , SYMBOL , SYMBOL , 76)
char_def(ASCII_w , 'w' , SYMBOL , SYMBOL , 77)
char_def(ASCII_x , 'x' , SYMBOL , SYMBOL , 78)
char_def(ASCII_y , 'y' , SYMBOL , SYMBOL , 79)
char_def(ASCII_z , 'z' , SYMBOL , SYMBOL , 7A)
char_def(ASCII_L_CURLY , '{' , L_CURLY , NO_SPACE , 7B)
char_def(ASCII_BAR , '|' , F12_STILE , NO_SPACE , 7C)
char_def(ASCII_R_CURLY , '}' , R_CURLY , NO_SPACE , 7D)
char_def(ASCII_TILDE , '~' , F12_WITHOUT , NO_SPACE , 7E)
char_def(ASCII_DELETE , 0x7F , END , NO_SPACE , 07F)
char_def(NO_BREAK_SPACE , 0x00A0 , END , NO_SPACE , FF) /* */
char_def(INVERTED_EXCLAM , 0x00A1 , END , NO_SPACE , 8D) /* ¡ */
char_def(POUND , 0x00A3 , END , NO_SPACE , 9C) /* £ */
char_def(YEN , 0x00A5 , END , NO_SPACE , 080) /* ¥ */
char_def(DIAERESIS , 0x00A8 , OPER1_EACH , NO_SPACE , FE) /* ¨ */
char_def(OVERBAR , 0x00AF , NUMERIC , SYMBOL , FD) /* ¯ */
char_df1(PAD_U2 , 0x00B2 , END , NO_SPACE , --) /* ² */
char_df1(PAD_U3 , 0x00B3 , END , NO_SPACE , --) /* ³ */
char_df1(PAD_U1 , 0x00B9 , END , NO_SPACE , --) /* ¹ */
char_df1(INVERTED_QUESTION , 0x00BF , END , NO_SPACE , A8) /* ¿ */
char_def(MULTIPLY , 0x00D7 , F12_TIMES , NO_SPACE , F5) /* × */
char_def(DIVIDE , 0x00F7 , F12_DIVIDE , NO_SPACE , F6) /* ÷ */
// FMGW
// Should only be SYMBOL if following A..Z or 0..9 -- this must be done
// in Token. If not done, this is a valid start of symbol..
char_def(COMBINING_LOWLINE , 0x0332 , SYMBOL , SYMBOL , DF) /* X̲ */
char_def(LAMBDA , 0x03BB , SYMBOL , SYMBOL , 99) /* λ */
char_df1(mue , 0x03BC , END , NO_SPACE , --) /* μ */
char_def(CHI , 0x03C7 , SYMBOL , SYMBOL , A2) /* χ */
char_df1(AV_MAX , 0x0461 , END , NO_SPACE , --) /* ѡ */
char_df1(PAD_U0 , 0x2070 , END , NO_SPACE , --) /* ⁰ */
char_df1(PAD_U4 , 0x2074 , END , NO_SPACE , --) /* ⁴ */
char_df1(PAD_U5 , 0x2075 , END , NO_SPACE , --) /* ⁵ */
char_df1(PAD_U6 , 0x2076 , END , NO_SPACE , --) /* ⁶ */
char_df1(PAD_U7 , 0x2077 , END , NO_SPACE , --) /* ⁷ */
char_df1(PAD_U8 , 0x2078 , END , NO_SPACE , --) /* ⁸ */
char_df1(PAD_U9 , 0x2079 , END , NO_SPACE , --) /* ⁹ */
char_df1(PAD_Un , 0x207F , END , NO_SPACE , --) /* ⁿ */
char_df1(PAD_L0 , 0x2080 , END , NO_SPACE , --) /* ₀ */
char_df1(PAD_L1 , 0x2081 , END , NO_SPACE , --) /* ₁ */
char_df1(PAD_L2 , 0x2082 , END , NO_SPACE , --) /* ₂ */
char_df1(PAD_L3 , 0x2083 , END , NO_SPACE , --) /* ₃ */
char_df1(PAD_L4 , 0x2084 , END , NO_SPACE , --) /* ₄ */
char_df1(PAD_L5 , 0x2085 , END , NO_SPACE , --) /* ₅ */
char_df1(PAD_L6 , 0x2086 , END , NO_SPACE , --) /* ₆ */
char_df1(PAD_L7 , 0x2087 , END , NO_SPACE , --) /* ₇ */
char_df1(PAD_L8 , 0x2088 , END , NO_SPACE , --) /* ₈ */
char_df1(PAD_L9 , 0x2089 , END , NO_SPACE , --) /* ₉ */
char_def(EURO , 0x20AC , END , NO_SPACE , 081) /* € */
char_def(LEFT_ARROW , 0x2190 , ASSIGN , NO_SPACE , BD) /* ← */
char_def(UP_ARROW , 0x2191 , F12_TAKE , NO_SPACE , C6) /* ↑ */
char_def(RIGHT_ARROW , 0x2192 , R_ARROW , NO_SPACE , B8) /* → */
char_def(DOWN_ARROW , 0x2193 , F12_DROP , NO_SPACE , C7) /* ↓ */
char_def(RIGHT_LEFT_ARROW , 0x21C4 , END , NO_SPACE , 082) /* ⇄ */
char_df1(DOUBLE_ARROW_L , 0x21E8 , END , NO_SPACE , --) /* ⇨ */
char_def(DELTA , 0x2206 , SYMBOL , SYMBOL , B6) /* ∆ */
char_def(NABLA , 0x2207 , END , NO_SPACE , B7) /* ∇ */
char_def(ELEMENT , 0x2208 , F12_ELEMENT , NO_SPACE , EE) /* ∈ */
char_df1(ELEMENT1 , 0x220A , END , NO_SPACE , --) /* ∊ */
char_def(RING_OPERATOR , 0x2218 , JOT , NO_SPACE , F8) /* ∘ */
char_df1(INFINITY , 0x221E , END , NO_SPACE , --) /* ∞ */
char_def(DIVIDES , 0x2223 , F12_STILE , NO_SPACE , B2) /* ∣ */
char_def(AND , 0x2227 , F2_AND , NO_SPACE , 83) /* ∧ */
char_def(OR , 0x2228 , F2_OR , NO_SPACE , EB) /* ∨ */
char_def(INTERSECTION , 0x2229 , F2_INTER , NO_SPACE , EF) /* ∩ */
char_def(UNION , 0x222A , F12_UNION , NO_SPACE , AC) /* ∪ */
char_def(DOTTED_DEL , 0x2235 , END , NO_SPACE , D2) /* ∵ */
char_def(TILDE_OPERATOR , 0x223C , F12_WITHOUT , NO_SPACE , 84) /* ∼ */
char_def(NOT_EQUAL , 0x2260 , F2_UNEQ , NO_SPACE , F4) /* ≠ */
char_def(EQUIVALENT , 0x2261 , F12_EQUIV , NO_SPACE , CF) /* ≡ */
char_def(NEQUIVALENT , 0x2262 , F12_NEQUIV , NO_SPACE , A3) /* ≢ */
char_def(LESS_OR_EQUAL , 0x2264 , F2_LEQ , NO_SPACE , F3) /* ≤ */
char_def(MORE_OR_EQUAL , 0x2265 , F2_MEQ , NO_SPACE , F2) /* ≥ */
char_def(BETWEEN , 0x226C , END , NO_SPACE , 085) /* ≬ */
char_def(SUBSET , 0x2282 , F12_PARTITION, NO_SPACE , E2) /* ⊂ */
char_def(SUPERSET , 0x2283 , F12_PICK , NO_SPACE , E3) /* ⊃ */
char_def(CIRCLE_BAR , 0x2296 , F12_ROTATE1 , NO_SPACE , E9) /* ⊖ */
char_def(RIGHT_TACK , 0x22A2 , F2_RIGHT , NO_SPACE , D6) /* ⊢ */
char_def(LEFT_TACK , 0x22A3 , F2_LEFT , NO_SPACE , D7) /* ⊣ */
char_def(DOWN_TACK , 0x22A4 , F12_ENCODE , NO_SPACE , 98) /* ⊤ */
char_def(UP_TACK , 0x22A5 , F12_DECODE , NO_SPACE , 9D) /* ⊥ */
char_def(STAR_OPERATOR , 0x22C6 , F12_POWER , NO_SPACE , 86) /* ⋆ */
char_def(EPSILON_UBAR , 0x22F8 , F2_FIND , NO_SPACE , 87) /* ⋸ */
char_def(LEFT_CEILING , 0x2308 , F12_RND_UP , NO_SPACE , A9) /* ⌈ */
char_def(LEFT_FLOOR , 0x230A , F12_RND_DN , NO_SPACE , BE) /* ⌊ */
char_def(I_BEAM , 0x2336 , END , NO_SPACE , 9F) /* ⌶ */
char_def(SQUISH_Quad , 0x2337 , F2_INDEX , NO_SPACE , D3) /* ⌷ */
char_def(Quad_EQUAL , 0x2338 , END , NO_SPACE , 088) /* ⌸ */
char_def(Quad_DIVIDE , 0x2339 , F12_DOMINO , NO_SPACE , 92) /* ⌹ */
char_def(Quad_DIAMOND , 0x233A , END , NO_SPACE , 089) /* ⌺ */
char_def(Quad_JOT , 0x233B , END , NO_SPACE , D5) /* ⌻ */
char_def(Quad_CIRCLE , 0x233C , END , NO_SPACE , 08A) /* ⌼ */
char_def(CIRCLE_STILE , 0x233D , F12_ROTATE , NO_SPACE , E8) /* ⌽ */
char_def(CIRCLE_JOT , 0x233E , END , NO_SPACE , 08B) /* ⌾ */
char_def(SLASH_BAR , 0x233F , OPER1_REDUCE1, NO_SPACE , F0) /* ⌿ */
char_def(BACKSLASH_BAR , 0x2340 , OPER1_SCAN1 , NO_SPACE , F1) /* ⍀ */
char_def(Quad_SLASH , 0x2341 , END , NO_SPACE , 08C) /* ⍁ */
char_def(Quad_BACKSLASH , 0x2342 , END , NO_SPACE , D4) /* ⍂ */
char_df1(Quad_LESS_THAN , 0x2343 , END , NO_SPACE , --) /* ⍃ */
char_df1(Quad_GREATER_THAN , 0x2344 , END , NO_SPACE , --) /* ⍄ */
char_def(LEFT_VANE , 0x2345 , END , NO_SPACE , 08F) /* ⍅ */
char_def(RIGHT_VANE , 0x2346 , END , NO_SPACE , 093) /* ⍆ */
char_def(Quad_LEFT_ARROW , 0x2347 , END , NO_SPACE , 095) /* ⍇ */
char_def(Quad_RIGHT_ARROW , 0x2348 , END , NO_SPACE , 096) /* ⍈ */
char_def(TRANSPOSE , 0x2349 , F12_TRANSPOSE, NO_SPACE , ED) /* ⍉ */
char_def(DTACK_UNDERBAR , 0x234A , END , NO_SPACE , 097) /* ⍊ */
char_def(SORT_ASCENDING , 0x234B , F12_SORT_ASC , NO_SPACE , FB) /* ⍋ */
char_def(Quad_DELTA , 0x234D , END , NO_SPACE , 09A) /* ⍍ */
char_def(EXECUTE , 0x234E , F1_EXECUTE , NO_SPACE , AF) /* ⍎ */
char_def(UP_VANE , 0x234F , END , NO_SPACE , 09B) /* ⍏ */
char_def(Quad_UP_ARROW , 0x2350 , END , NO_SPACE , 0A0) /* ⍐ */
char_def(UP_TACK_OVERBAR , 0x2351 , END , NO_SPACE , 0A1) /* ⍑ */
char_def(SORT_DECENDING , 0x2352 , F12_SORT_DES , NO_SPACE , FC) /* ⍒ */
char_def(FORMAT , 0x2355 , F12_FORMAT , NO_SPACE , AE) /* ⍕ */
char_def(DOWN_VANE , 0x2356 , END , NO_SPACE , 0A4) /* ⍖ */
char_def(Quad_DOWN_ARROW , 0x2357 , END , NO_SPACE , 0A5) /* ⍗ */
char_def(QUOTE_UNDERBAR , 0x2358 , END , NO_SPACE , 0A6) /* ⍘ */
char_def(DELTA_UNDERBAR , 0x2359 , SYMBOL , SYMBOL , F7) /* ⍙ */
char_def(DIAMOND_UNDERBAR , 0x235A , END , NO_SPACE , 0A7) /* ⍚ */
char_def(JOT_UNDERBAR , 0x235B , END , NO_SPACE , 0A8) /* ⍛ */
char_def(CIRCLE_UNDERBAR , 0x235C , END , NO_SPACE , 0AA) /* ⍜ */
char_def(COMMENT , 0x235D , END , NO_SPACE , E4) /* ⍝ */
char_def(QUOTE_Quad , 0x235E , Quad_QUOTE , NO_SPACE , 91) /* ⍞ */
char_def(LOGARITHM , 0x235F , F12_LOGA , NO_SPACE , B5) /* ⍟ */
char_df1(Quad_COLON , 0x2360 , END , NO_SPACE , --) /* ⍠ */
char_df1(UTACK_DIAERESIS , 0x2361 , END , NO_SPACE , --) /* ⍡ */
char_def(DEL_DIAERESIS , 0x2362 , END , NO_SPACE , 0AB) /* ⍢ */
char_def(STAR_DIAERESIS , 0x2363 , OPER2_POWER , NO_SPACE , 8E) /* ⍣ */
char_def(JOT_DIARESIS , 0x2364 , OPER2_RANK , NO_SPACE , 94) /* ⍤ */
char_df1(CIRCLE_DIARESIS , 0x2365 , END , NO_SPACE , --) /* ⍥ */
char_df1(DOWN_SHOE_STILE , 0x2366 , END , NO_SPACE , --) /* ⍦ */
char_df1(LEFT_SHOE_STILE , 0x2367 , END , NO_SPACE , --) /* ⍧ */
char_def(TILDE_DIAERESIS , 0x2368 , OPER1_COMMUTE, NO_SPACE , AD) /* ⍨ */
char_df1(GT_THAN_DIAERESIS , 0x2369 , END , NO_SPACE , --) /* ⍩ */
char_def(COMMA_BAR , 0x236A , F12_COMMA1 , NO_SPACE , B1) /* ⍪ */
char_def(DEL_TILDE , 0x236B , END , NO_SPACE , FA) /* ⍫ */
char_def(ZILDE , 0x236C , F0_ZILDE , NO_SPACE , B0) /* ⍬ */
char_df1(STILE_TILDE , 0x236D , END , NO_SPACE , --) /* ⍭ */
char_df1(SEMICOL_UNDERBAR , 0x236E , END , NO_SPACE , --) /* ⍮ */
char_df1(Quad_NOT_EQUAL , 0x236F , END , NO_SPACE , --) /* ⍯ */
char_df1(Quad_QUEST_MARK , 0x2370 , END , NO_SPACE , --) /* ⍰ */
char_def(NOR , 0x2371 , F2_NOR , NO_SPACE , E7) /* ⍱ */
char_def(NAND , 0x2372 , F2_NAND , NO_SPACE , E5) /* ⍲ */
char_def(IOTA , 0x2373 , F12_INDEX_OF , NO_SPACE , EC) /* ⍳ */
char_def(RHO , 0x2374 , F12_RHO , NO_SPACE , E6) /* ⍴ */
char_def(OMEGA , 0x2375 , SYMBOL , SYMBOL , F9) /* ⍵ */
char_def(ALPHA_UNDERBAR , 0x2376 , SYMBOL , SYMBOL , 9E) /* ⍶ */
char_def(EPSILON_UNDERBAR , 0x2377 , F2_FIND , NO_SPACE , D1) /* ⍷ */
char_def(INDEX_UNDERBAR , 0x2378 , END , NO_SPACE , D0) /* ⍸ */
char_def(OMEGA_UNDERBAR , 0x2379 , SYMBOL , SYMBOL , E1) /* ⍹ */
char_def(ALPHA , 0x237A , SYMBOL , SYMBOL , E0) /* ⍺ */
char_def(Quad_Quad , 0x2395 , Quad_Quad , NONE , 90) /* ⎕ */
char_def(LINE_HORI , 0x2500 , END , NO_SPACE , C4) /* ─ */
char_df1(LINE_HORI2 , 0x2501 , END , NO_SPACE , --) /* ━ */
char_def(LINE_VERT , 0x2502 , END , NO_SPACE , B3) /* │ */
char_df1(LINE_VERT2 , 0x2503 , END , NO_SPACE , --) /* ┃ */
char_def(LINE_DOWN_RIGHT , 0x250C , END , NO_SPACE , DA) /* ┌ */
char_df1(LINE_DOWN2_RIGHT2 , 0x250F , END , NO_SPACE , --) /* ┏ */
char_def(LINE_DOWN_LEFT , 0x2510 , END , NO_SPACE , BF) /* ┐ */
char_df1(LINE_DOWN2_LEFT2 , 0x2513 , END , NO_SPACE , --) /* ┓ */
char_def(LINE_UP_RIGHT , 0x2514 , END , NO_SPACE , C0) /* └ */
char_df1(LINE_UP2_RIGHT2 , 0x2517 , END , NO_SPACE , --) /* ┗ */
char_def(LINE_UP_LEFT , 0x2518 , END , NO_SPACE , D9) /* ┘ */
char_df1(LINE_UP2_LEFT2 , 0x251B , END , NO_SPACE , --) /* ┛ */
char_def(LINE_VERT_RIGHT , 0x251C , END , NO_SPACE , C3) /* ├ */
char_def(LINE_VERT_LEFT , 0x2524 , END , NO_SPACE , B4) /* ┤ */
char_def(LINE_DOWN_HORI , 0x252C , END , NO_SPACE , C2) /* ┬ */
char_def(LINE_UP_HORI , 0x2534 , END , NO_SPACE , C1) /* ┴ */
char_def(LINE_VERT_HORI , 0x253C , END , NO_SPACE , C5) /* ┼ */
char_def(LINE2_HORI , 0x2550 , END , NO_SPACE , CD) /* ═ */
char_def(LINE2_VERT , 0x2551 , END , NO_SPACE , BA) /* ║ */
char_def(LINE2_DOWN_RIGHT , 0x2554 , END , NO_SPACE , C8) /* ╔ */
char_def(LINE2_DOWN_LEFT , 0x2557 , END , NO_SPACE , BB) /* ╗ */
char_def(LINE2_UP_RIGHT , 0x255A , END , NO_SPACE , C9) /* ╚ */
char_def(LINE2_UP_LEFT , 0x255D , END , NO_SPACE , BC) /* ╝ */
char_def(LINE2_VERT_RIGHT , 0x2560 , END , NO_SPACE , CC) /* ╠ */
char_def(LINE2_VERT_LEFT , 0x2563 , END , NO_SPACE , B9) /* ╣ */
char_def(LINE2_HORI_DOWN , 0x2566 , END , NO_SPACE , CB) /* ╦ */
char_def(LINE2_HORI_UP , 0x2569 , END , NO_SPACE , CA) /* ╩ */
char_def(LINE2_VERT_HORI , 0x256C , END , NO_SPACE , CE) /* ╬ */
// FMGW
//char_def(UPPER_HALF_BLOCK , 0x2580 , END , NO_SPACE , DF) /* ▀ */
char_def(LOWER_HALF_BLOCK , 0x2584 , END , NO_SPACE , DC) /* ▄ */
char_def(FULL_BLOCK , 0x2588 , END , NO_SPACE , DB) /* █ */
char_def(LEFT_HALF_BLOCK , 0x258C , END , NO_SPACE , DD) /* ▌ */
char_df1(Quad_Quad1 , 0x25AF , END , NO_SPACE , --) /* ▯ */
char_def(RIGHT_HALF_BLOCK , 0x2590 , END , NO_SPACE , DE) /* ▐ */
char_def(DIAMOND , 0x25CA , DIAMOND , NO_SPACE , D8) /* ◊ */
char_def(CIRCLE , 0x25CB , F12_CIRCLE , NO_SPACE , EA) /* ○ */
#undef char_def
#undef char_df1