import-def.scm 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. ; Two macros:
  3. ;
  4. ; (import-definition <id>)
  5. ; ->
  6. ; (define <id> (lookup-imported-binding "<id with - becoming _>"))
  7. ;
  8. ; (import-definition <id> <string id>)
  9. ; ->
  10. ; (define <id> (lookup-imported-binding <string-id>))
  11. ;
  12. ; (import-lambda-definition <id> (<formal> ...))
  13. ; ->
  14. ; (begin
  15. ; (define temp (lookup-imported-binding "<id with - becoming _>"))
  16. ; (define <id>
  17. ; (lambda (<formal> ...)
  18. ; (call-imported-binding temp <formal> ...))))
  19. ;
  20. ; (import-lambda-definition <id> (<formal> ...) <string id>)
  21. ; ->
  22. ; ...same again using <string id> as the imported name...
  23. (define-syntax import-definition
  24. (lambda (exp rename compare)
  25. (let ((id (cadr exp))
  26. (%define (rename 'define))
  27. (%lookup-imported-binding (rename 'lookup-imported-binding)))
  28. (let ((external-id (if (null? (cddr exp))
  29. (list->string (map (lambda (ch)
  30. (if (char=? ch #\-)
  31. #\_
  32. ch))
  33. (string->list
  34. (symbol->string id))))
  35. (caddr exp))))
  36. `(,%define ,id
  37. (,%lookup-imported-binding ,external-id))))))
  38. ; (import-lambda-definition id (formal ...) [external name])
  39. (define-syntax import-lambda-definition
  40. (lambda (exp rename compare)
  41. (let ((id (cadr exp))
  42. (formals (caddr exp))
  43. (%define (rename 'define))
  44. (%begin (rename 'begin))
  45. (%lambda (rename 'lambda))
  46. (%call-imported-binding (rename 'call-imported-binding))
  47. (%lookup-imported-binding (rename 'lookup-imported-binding))
  48. (%binding (rename 'binding)))
  49. (let ((external-id (if (null? (cdddr exp))
  50. (list->string (map (lambda (ch)
  51. (if (char=? ch #\-)
  52. #\_
  53. ch))
  54. (string->list
  55. (symbol->string id))))
  56. (cadddr exp))))
  57. `(,%begin
  58. (,%define ,%binding
  59. (,%lookup-imported-binding ,external-id))
  60. (,%define ,id
  61. (,%lambda ,formals
  62. (,%call-imported-binding ,%binding . ,formals))))))))