utilities.scm 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. ;(define-module (trs utilities)
  2. ; #:use-module (ice-9 match)
  3. ; #:use-module (srfi srfi-11)
  4. ; #:export (step-body atomic? iterate qqify))
  5. (library (utilities)
  6. (export step-body atomic? iterate qqify)
  7. (import (chezscheme))
  8. (define (any/map f l)
  9. (if (null? l)
  10. (values #f '())
  11. (let-values (((p1 v1) (f (car l)))
  12. ((p2 v2) (any/map f (cdr l))))
  13. (values (or p1 p2)
  14. (cons v1 v2)))))
  15. (define (step-body step s)
  16. (let-values (((progress tail) (any/map step (cdr s))))
  17. (values progress (cons (car s) tail))))
  18. (define (iterate step s)
  19. (let-values (((progress s^) (step s)))
  20. (if progress
  21. (iterate step s^)
  22. s^)))
  23. (define (atomic? s)
  24. (or (symbol? s) (boolean? s) (number? s)))
  25. (define syntax-car
  26. (lambda (ls)
  27. (syntax-case ls ()
  28. ((x . y) #'x))))
  29. (define syntax-cdr
  30. (lambda (ls)
  31. (syntax-case ls ()
  32. ((x . y) #'y))))
  33. (define (qqify xs)
  34. (define (rec x)
  35. (let ((x^ (syntax->datum x)))
  36. (cond ((symbol? x^)
  37. (list #'unquote x))
  38. ((or (boolean? x^)
  39. (number? x^))
  40. x)
  41. (else
  42. `(,(syntax-car x) . ,(map rec (syntax->list (syntax-cdr x))))))))
  43. (list #'quasiquote (rec xs)))
  44. )