PLEAC examples - 6. Pattern Matching
6.0. Introduction
Note: PicoLisp has no strings, and doesn't operate on symbol names directly. Instead, patterns are applied to lists.6.0.1 Example
# The match returns T if it succeeded to match the pattern : (match '(@Name had a @Adj lamb) '(Mary had a little lamb)) -> T : @Name -> (Mary) : @Adj -> (little)
6.1. Copying and Substituting Simultaneously
You're tired of constantly using two separate statements with redundant information, one to copy and another to substitute.6.1.1. Example
# Example 1 - Replace 'town' bt 'village' : (replace '(here in this town) 'this 'that 'town 'village) -> (here in that village) # Example 2 - With / as delimiter, return the last part : (setq F (chop "abc/def/ghi")) -> ("a" "b" "c" "/" "d" "e" "f" "/" "g" "h" "i") : F -> ("a" "b" "c" "/" "d" "e" "f" "/" "g" "h" "i") : (split F '/) -> (("a" "b" "c") ("d" "e" "f") ("g" "h" "i")) : (last (split F '/)) -> ("g" "h" "i") : (stem F '/) -> ("g" "h" "i") : (pack '("g" "h" "i")) -> "ghi" # Example 2 - Same, but now in one go ... : (let F (chop "abc/def/ghi") (prinl (pack (last (split F '/)))) (prinl (pack (stem F '/))) ) ghi ghi -> "ghi" # Example 3 - Make All Words Title-Cased : (mapcar '((W) (pack (uppc (car W)) (cdr W))) (split (chop "Mary had a little lamb") " ") ) -> ("Mary" "Had" "A" "Little" "Lamb") # Example 4 - Replace 'man3' by 'cat3' : (glue '/ (replace (split (chop "/usr/man/man3/foo.1") "/") '("m" "a" "n" "3") '("c" "a" "t" "3") ) ) -> "/usr/man/cat3/foo.1" # Example 5 - Replace last part of substrings delimited by / with 'lib' : (mapcar '((S) (pack (glue '/ (head -1 (split (chop S) '/))) "/lib")) '("/usr/bin" "/bin" "/usr/local/bin") ) -> ("/usr/lib" "/lib" "/usr/local/lib")
6.2. Matching Letters
You want to see whether a value only consists of alphabetic characters.6.2.1. Example
# Is my input list purely alphabetic? : (de isalpha? (Lst) (fully '((C) (or (>= "Z" C "A") (>= "z" C "a")) ) Lst ) ) -> NIL : (isalpha? '(a b c d e f g h)) -> T : (isalpha? '(a b c D e f G h)) -> T : (isalpha? (1 2 3)) -> NIL
6.3. Matching Words
You want to pick out words from a string.6.3.1. Example
# Returns the first space delimited word of the input : (make (find '((C) (or (sp? C) (nil (link C)))) (chop "abcd efg") ) ) -> ("a" "b" "c" "d") # Returns first part of the input up to any char that is not [ A..Z | a..z| ' | - ] : (make (find '((C) (nand (or (>= "Z" C "A") (>= "z" C "a") (sub? C "`-")) (link C) ) ) (chop "ab`c-d/e") ) ) -> ("a" "b" "`" "c" "-" "d")
https://picolisp.com/wiki/?pcepleacmatching
23jun18 | ArievW |