prelude.scm 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. ;;; prelude, using scheme9 as an example
  2. ;;; R7RS syntax/procedures
  3. (define values list)
  4. (define (DEFINE-VALUES-WITH-VALUES name-list expr-list)
  5. (cons 'begin (map (lambda (a b)
  6. (list 'define a b))
  7. name-list
  8. expr-list)))
  9. (define-syntax define-values
  10. (syntax-rules ()
  11. ((_ (name ...) expr)
  12. (eval
  13. (DEFINE-VALUES-WITH-VALUES
  14. (list 'name ...)
  15. (map (lambda (e) (list 'quote e)) expr))))))
  16. (define exact inexact->exact)
  17. (define inexact exact->inexact)
  18. (define (vector->string v) (list->string (vector->list v)))
  19. (define (string->vector s) (list->vector (string->list s)))
  20. (define (square n) (* n n))
  21. (define (exact-integer? n)
  22. (and (integer? n)
  23. (exact? n)))
  24. (define-syntax case-lambda
  25. (syntax-rules ()
  26. ((_ (cnt . behavior) ...)
  27. (let ((lams (list (cons (length 'cnt)
  28. (lambda cnt . behavior))
  29. ...)))
  30. (lambda args
  31. (apply (cdr (assv (length args) lams)) args))))))
  32. (define iota
  33. (case-lambda
  34. ((size) (iota size 0))
  35. ((size start) (iota size start 1))
  36. ((size start step)
  37. (let loop ((result '())
  38. (i start)
  39. (count 0))
  40. (if (< count size)
  41. (loop (cons i result)
  42. (+ i step)
  43. (+ count 1))
  44. (reverse result))))))
  45. (define make-list
  46. (case-lambda
  47. ((sz) (make-list sz #f))
  48. ((sz value)
  49. (let loop ((result '())
  50. (count 0))
  51. (if (< count sz)
  52. (loop (cons value result)
  53. (+ count 1))
  54. result)))))
  55. (define (reduce proc init l)
  56. (if (null? l)
  57. init
  58. (let loop ((value (car l))
  59. (next (cdr l)))
  60. (if (null? next)
  61. value
  62. (loop (proc value (car next))
  63. (cdr next))))))
  64. ;;; R7RS libraries
  65. (define defined-library-list '())
  66. (define loaded-library-list '())
  67. (define (from-defined-to-loaded library-name)
  68. (define lib (cdr (assoc library-name defined-library-list)))
  69. (let ()
  70. (load-library-include library-name (car (cdr (assq 'include lib))))
  71. (eval (list 'values (cdr (assq 'export lib))))))
  72. (define (get-library-path-name library-name)
  73. (let loop ((result '("./"))
  74. (next library-name))
  75. (if (null? next)
  76. (apply string-append (reverse (cons ".sld" (cdr result))))
  77. (loop (cons "/" (cons (symbol->string (car next)) result))
  78. (cdr next)))))
  79. (define (load-library-path library-name)
  80. (unless (assoc library-name defined-library-list)
  81. (load (get-library-path-name library-name))))
  82. (define (get-library-include-name library-name include-name)
  83. (let loop ((result '("./"))
  84. (next library-name))
  85. (if (null? next)
  86. (apply string-append (reverse (cons include-name (cdr (cdr result)))))
  87. (loop (cons "/" (cons (symbol->string (car next)) result))
  88. (cdr next)))))
  89. (define (load-library-include library-name include-name)
  90. (load (get-library-include-name library-name include-name)))
  91. (define (parse-define-library library-expression)
  92. (define exports (assq 'export library-expression))
  93. (define imports (assq 'import library-expression))
  94. (define includes (assq 'include library-expression))
  95. (define begins (assq 'begin library-expression))
  96. (list imports exports includes begins))
  97. (define (add-to-library name library-expression)
  98. (set! defined-library-list
  99. (cons (cons name (parse-define-library library-expression))
  100. defined-library-list)))
  101. (define-syntax define-library
  102. (syntax-rules ()
  103. ((_ name . expression)
  104. (add-to-library 'name 'expression))))
  105. (define-syntax import
  106. (syntax-rules ()
  107. ((_ (base-name name ...))
  108. (let ((lib-name '(base-name name ...)))
  109. (load-library-path lib-name)
  110. (from-defined-to-loaded lib-name)))
  111. ((_ (base-name name ...) others ...)
  112. (begin
  113. (import (base-name name ...))
  114. (import others ...)))))
  115. (define-syntax export
  116. (syntax-rules ()
  117. ((_ . any) #f)))
  118. (define-syntax include
  119. (syntax-rules ()
  120. ((_ path)
  121. (load path))))