J implementation places an artificial limit on the lengths of names. try (255$'a')=.0 (256$'a')=.0 |limit error | (256$'a') =.0
Ср, 03 сен 2014, jprogramming написал(а): > strbracket =: {.@:[ , ] , {:@[ > joinB =: (1 : ' ((- # m)&}.@;@(,&m&.>"1))')(@: (] : ;)) > nums2name =: 'NUM' joinB@:cut@:(('.';'F') rplc~ ('_';'n') rplc~ ":)^:(1 4 8 > 16 64 128 e.~ 3!:0) > boxsandnums2name =: [: (('B0X_',:'B0oX') strbracket '_' joinB )^:(32 = 3!:0 > ) L:1 ^:_ ^:(1 <L.) nums2name L:0 > text2name =: ('_' joinB)@:,&boxopen&([: cut (AlphaNum_j_, ' ')&(-.~ -.~ > ]))^:(2 = 3!:0) > buildvar =: ([: ('_'joinB)@:('_'&cut)@:('_'joinB) [: ('_' > joinB)@:,&boxopen&boxsandnums2name&.> text2name L:0 )@:boxopen@:(] :;) > > joinB is an adverb similar to ;: inv. ' ' JoinB is identical to ;: inv. > Except rather than space, any string can be used to join together boxes, and > it can be used dyadically implicitly boxing the arguments. > > 'fd' '_'joinB 'hh' > fd_hh > > '_'joinB <'hh' > hh > > '_|_'joinB ;: 'fb hh try' > fb_|_hh_|_try > > > nums2name will take a numeric list (or scalar) and strip out _ and . It will > also insert 'NUM' between numeric list items. > > nums2name each _4.32;i.2 3 > ┌─────┬──────────────────┐ > │n4F32│0NUM1NUM23NUM4NUM5│ > └─────┴──────────────────┘ > the above may seem buggy (23) but cleaner separation for higher dimensional > lists can be obtained by boxing them. > > nums2name each _4.32;<"1 i.2 3 > ┌─────┬─────────┬─────────┐ > │n4F32│0NUM1NUM2│3NUM4NUM5│ > └─────┴─────────┴─────────┘ > > nums2name each 'asdf';_4.32; i.2 3 NB. leaves non numeric data unchanged > ┌────┬─────┬──────────────────┐ > │asdf│n4F32│0NUM1NUM23NUM4NUM5│ > └────┴─────┴──────────────────┘ > > > boxsandnums2name calls nums2names first such that all data processed is > strings and boxes of strings. There is a neat recursive process I discovered > for flattening trees. It tunnels down to L:1 level, and flattens that level > converting the L:1 cell to a string, then recurses "upwards" until there are > no more L:2+ cells. > > boxsandnums2name (5!:2 <'nums2name') > B0X_B0X_B0X_B0X_B0X_B0X_n3_&_}.B0oX_@_;B0oX_@_B0X_B0X_B0X_,_&_NUMB0oX_&._>B0oX_"_1B0oXB0oX_@:_cutB0oX_@:_B0X_B0X_._FB0oX_B0X_rplc_~B0oX_B0X_B0X___nB0oX_B0X_rplc_~B0oX_":B0oXB0oXB0oX_^:_B0X_1NUM4NUM8NUM16NUM64NUM128_B0X_e._~B0oX_B0X_3_!:_0B0oXB0oXB0oX > > text2name strips all punctuation from a string then replaces (possible > multiple) spaces with '_' > > buildvar makes the hash. Using all of the previous functions. > > for strings, words in a string will hash to same value as a list of boxed > words. > buildvar 'asd fsdf sdf sd fsd f' > asd_fsdf_sdf_sd_fsd_f > buildvar ;:'asd fsdf sdf sd fsd f' > asd_fsdf_sdf_sd_fsd_f > > same as this dyadic call: > 'asd' buildvar ' fsdf sdf sd fsd f' > asd_fsdf_sdf_sd_fsd_f > > 'asd' buildvar ' fsdf sdf sd fsd f'; 123 _33.3 > asd_fsdf_sdf_sd_fsd_f_123NUMn33F3 > > for numbers though, boxed nums hash differently than a list of numbers > > buildvar 1 2.4 _33 > 1NUM2F4NUMn33 > buildvar ;/ 1 2.4 _33 > 1_2F4_n33 > buildvar << ;/ 1 2.4 _33 > B0X_B0X_1_2F4_n33B0oXB0oX > > You may note that numbers do not produce a legal variable name if the leading > character is a number. The presented routine creates the core hash. Its > expected that a classifying prefix would be appended, and a locale would be > attached. > > boxed positive integers and their text version hash identically. As strings > though, negatives and decimal points are stripped off. > > buildvar ;: 'sdf sdf dsdff 1 2.4 _33' > sdf_sdf_dsdff_1_24_33 > buildvar ".^:(0 -.@-: 0&".) each ;: 'sdf sdf dsdff 1 2.4 _33' > sdf_sdf_dsdff_1NUM2F4NUMn33 > > > > doesn't work great (too many symbols stripped out) for J code, but it still > works: > buildvar quote 5!:5 <'nums2name' > 3NUM1cutF_rplc_n_rplc_1_4_8_16_64_128_e_30 > > buildvar (5!:2 <'nums2name') > B0X_B0X_B0X_B0X_B0X_n3_B0oX_B0oX_B0X_B0X_B0X_NUMB0oX_B0oX_1B0oXB0oX_cutB0oX_B0X_B0X_FB0oX_B0X_rplc_B0oX_B0X_B0X_nB0oX_B0X_rplc_B0oX_B0oXB0oXB0oX_B0X_1NUM4NUM8NUM16NUM64NUM128_B0X_e_B0oX_B0X_3_0B0oXB0oX > > The hash is symetrical for Alpha Num and space. That is, if no symbol has > been stripped off, then the original data structure can be recovered. It is > somewhat human readable. > > As to why, it can hash anything, and since the hash value is the basis for a > legal J name, anything can be associated with anything. A prefix can provide > context for what you are associating and so what to do with the content, and > allows classification such that multiple data (dictionaries) can be held > within a single locale. > > Compared to a boxed dictionary structure, value retrieval is faster. By > holding a tree structure within prefixes, tree traversal is also faster. A > linked list where the hash of the data gives the location of the next node is > an application. If the data is reversible (boxedalphanumspace) then you also > get double linked list. Because of infinite boxing, all data can be > transformed into alphanumspace. > > Compared to symbols, the hash is permanent, repeatable, serializable, and > shareable among machines. > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm -- regards, ==================================================== GPG key 1024D/4434BAB3 2008-08-24 gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3 gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm