HasSetter.java 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package gnu.mapping;
  2. /** A Procedure that can be used on the left-hand-side of an assignment.
  3. * It can do that by overriding getSetter.
  4. * Alternatively, it can use the default getSetter, as long as it
  5. * overrides one of set0 (if a 0-argument Procedure)
  6. * set1 (if a 1-argument Procedure), or setN (otherwise).
  7. */
  8. public interface HasSetter
  9. {
  10. public Procedure getSetter();
  11. };
  12. /*
  13. (define-syntax set!
  14. (syntax-rules ()
  15. ((set! (func arg ...) rhs)
  16. ((setter func) arg ... rhs))
  17. ((set! var rhs)
  18. (%set! var rhs))))
  19. Better code generation:
  20. (apply (setter f) rhs args ...)
  21. => f.set(rhs args ...)
  22. E.g.
  23. (set (f) rhs) => [compile f].set0([compile rhs])
  24. (set (f x) rhs) => [compile f].set1([compile x], [compile rhs])
  25. (set (f x1 .. xn) rhs)
  26. => [compile f].setN([[compile x1], .. [compile xn], [compile rhs]])
  27. Examples:
  28. (setter car) == set-car!
  29. (setter cdr) == set-cdr!
  30. (setter caXXXr) == (lambda (rhs pair) (set-car! (cXXXr pair) rhs)) ???
  31. (setter cdXXXr) == (lambda (rhs pair) (set-cdr! (cXXXr pair) rhs)) ???
  32. (setter list-ref) ...
  33. (ENV 'NAME) => value of NAME in ENV
  34. (set! (ENV 'NAME) VAL) => set value of NAME in ENV to VAL
  35. (CELL) => current value of CELL
  36. (set! (CELL) VALUE) => set value of CELL to VALUE
  37. */