about summary refs log tree commit diff stats
path: root/src/util.scm
blob: 41da769a83a6b8c3d9ea596afb4176e8a2b59cf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(module (jimmy util) *

  (import scheme (chicken base)
          (chicken condition)
          (chicken string))

  (define-syntax define-public
    (syntax-rules ()
      ((define-public (name . arg) forms ...)
       (begin (export name)
              (define (name . arg) forms ...)))
      ((define-public (name args ...) forms ...)
       (begin (export name)
              (define (name args ...) forms ...)))
      ((define-public name value)
       (begin (export name)
              (define name value)))))

  (define-syntax ignore-errors
    (syntax-rules ()
      ((ignore-errors x)
       (handle-exceptions e #f x))))

  (define (alist-walk lis . keys)
    (if (null? keys)
        lis
        (let ((kv (assoc (car keys) lis)))
          (cond
           ((not kv) #f)
           ((atom? (cdr kv))
            (and (null? (cdr keys))       ; this shouldn't error...
                 (cdr kv)))
           ((list? (cdr kv))
            (apply alist-walk (cdr kv) (cdr keys)))))))

  (define (string-join ss #!optional (sep " "))
  (string-intersperse ss sep)))