Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 116,525 of 117,927    |
|    B. Pym to B. Pym    |
|    Re: Lisp problem    |
|    03 Jun 24 16:50:30    |
   
   From: No_spamming@noWhere_7073.org   
      
   On 6/3/2024, B. Pym wrote:   
      
   > HenHanna wrote:   
   >   
   > > How can I write this function simply? (in Common Lisp)   
   > >   
   > > -- Given a string 'a.bc.' -- replace each dot(.) with 0 or 1.   
   > >   
   > > -- So the value is a list of 4 strings:   
   > > ('a0bc0' 'a0bc1' 'a1bc0' 'a1bc1')   
   > >   
   > > -- The order is not important.   
   > > If the string has 3 dots, the value is a list of length 8.   
   >   
   >   
   > SP-Forth   
      
   Using a list.   
      
   REQUIRE { ~ac/lib/locals.f   
   REQUIRE StringReplace2 ~nn\lib\string.f   
   REQUIRE printf<[ ~ilya\Lib\win\System\printf.f   
   REQUIRE list-all ~ygrek/lib/list/all.f \ all words for cons pair lists   
    list ALSO!   
   REQUIRE CASE-INS lib/ext/caseins.f \ Case-insensitive.   
      
   : get-bin-digits ( u n -- ...) 0 do dup 1 and swap 2 / loop drop ;   
      
   : str-0-term ( adr) count + 0 swap c! ;   
      
   : s-keep ( cadr len -- adr) here place here 256 allot ;   
      
   create form-str 257 allot   
   0 value cnt   
   0 value mylist   
      
   : dotty { adr len -- }   
    \ Doesn't terminate output string with 0-byte.   
    form-str adr len s" ." s" %d" StringReplace2   
    form-str str-0-term   
    len - to cnt drop   
    %[ \ Start a list.   
    1 cnt 0 do 2 * loop   
    0 do   
    printf<[ i cnt get-bin-digits form-str count ]>   
    s-keep % \ Add to list.   
    loop   
    ]%   
      
      
   s" apple.bun.c.d" dotty to mylist   
   cr s" Length of list is " type mylist length . cr   
   mylist :noname count type cr ; iter   
      
    ===>   
   Length of list is 8   
      
   apple0bun0c0d   
   apple0bun0c1d   
   apple0bun1c0d   
   apple0bun1c1d   
   apple1bun0c0d   
   apple1bun0c1d   
   apple1bun1c0d   
   apple1bun1c1d   
      
      
      
   Just for fun, let's add up the lengths of the strings   
   in the list.   
      
   0 mylist :noname count nip + ; iter .   
    ===>   
   104   
      
   Let's convert the strings to uppercase.   
      
   REQUIRE UPPERCASE ~ac/lib/string/uppercase.f   
      
   mylist :noname count uppercase ; iter   
   mylist :noname count type cr ; iter   
    ===>   
   APPLE0BUN0C0D   
   APPLE0BUN0C1D   
   APPLE0BUN1C0D   
   APPLE0BUN1C1D   
   APPLE1BUN0C0D   
   APPLE1BUN0C1D   
   APPLE1BUN1C0D   
   APPLE1BUN1C1D   
      
   Let's sort by the penultimate character.   
      
   : get-ch ( cadr n -- chr ) drop 11 + c@ ;   
      
   mylist :noname count get-ch swap count get-ch swap < ; sort   
      
   mylist :noname count type cr ; iter   
    ===>   
   APPLE0BUN0C0D   
   APPLE0BUN1C0D   
   APPLE1BUN0C0D   
   APPLE1BUN1C0D   
   APPLE0BUN0C1D   
   APPLE0BUN1C1D   
   APPLE1BUN0C1D   
   APPLE1BUN1C1D   
      
   Filtering. Make a new list that   
   only has strings containing "N0".   
      
   %[ mylist   
    :noname   
    dup count s" N0" StringGetPos   
    if % else drop then ;   
    iter   
   ]%   
      
   :noname count type cr ; iter   
    ===>   
   APPLE0BUN0C0D   
   APPLE1BUN0C0D   
   APPLE0BUN0C1D   
   APPLE1BUN0C1D   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca