chialisp 0.5.0

tools for working with chialisp language; compiler, repl, python and wasm bindings
Documentation
;; Adapted from: https://rosettacode.org/wiki/Babbage_problem#Scheme
(mod (N)
  (include *standard-cl-23*)

  (defun digits_ (result n)
    (assign
      (d . r) (divmod n 10)
      (if d
        (digits_ (c r result) d)
        (c r result)
        )
      )
    )

  (defun digits (n) (if n (digits_ () n) ()))

  (defun reverse_ (result lst)
    (if lst
      (reverse_ (c (f lst) result) (r lst))
      result
      )
    )

  (defun reverse (lst) (reverse_ () lst))

  (defun starts-with (lst prefix)
    (if prefix
      (if lst
        (if (= (f prefix) (f lst))
          (starts-with (r lst) (r prefix))
          ()
          )
        ()
        )
      1
      )
    )

  (defun ends-with (lst tail)
    ;; does list end with tail?
    (starts-with (reverse lst) (reverse tail))
    )

  (defun loop (start fun)
    (let ((res (a fun (list start))))
      (if res
        (f res)
        (loop (+ 1 start) fun)
        )
      )
    )

  (loop 1
    (lambda ((& N) idx)
      (if (ends-with (digits (* idx idx)) (digits N))
        (list idx)
        ()
        )
      )
    )
  )