• Frere_de_la_QuoteB
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    This is a very complex problem. Maybe this will have some interest for you:

    https://github.com/naver/lispe/wiki/6.1-Pattern-Functions

    Here is how fizzbuzz is implemented:

    ; check if the rest of v/d is 0
    (defun checkmod (v d) (eq (% v d) 0))
    
    ; if the element can be divided by 15 we return fizzbuzz
    (defpat fizzbuzz ( [integer_ (not (% x 15))] ) 'fizzbuzz)
    
    ; if the element can be divided by 3 we return fizz
    (defpat fizzbuzz ( [integer_ (checkmod x 3)] ) 'fizz)
    
    ; if the element can be divided by 5 we return buzz
    (defpat fizzbuzz ( [integer_ (checkmod x 5)] ) 'buzz)
    
    ; rollback function, no type, we return x
    ; This function will only be called, if none of the above did apply
    (defpat fizzbuzz (x) x)
    
    ; we apply 'fizzbuzz' to the first 100 elements.
    ; The argument type is: integer_
    
    (mapcar 'fizzbuzz (range 1 100 1))