[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Various Problem Comments



I find some aspects of this proposal UN-scheme like.

[1]=========

(define-class class-name superclass-name ...
                         ^^^^^^^^^^^^^^^

(instantiate class-name ...
             ^^^^^^^^^^

There are a number of forms where a class name is required but which should accept a class object.

Given multiple top-level namespaces (modules), the use of a single, separate namespace for classes seems very fragile.  [There is no relation of class to lexical or module scope].


[2]=========

(define-generic (generic-name variable ...)
  ;; where variable is
  ;;    symbol                                   ; regular variable
  ;;  | (symbol [ class-name ])                  ; discriminating variable
  [ default-body ] )

I would use the term "name" rather than "symbol" as a symbol is typically quoted but the 'variable' name is apparently not evaluated.


[3]=========

There is no accessor specified to get a Field from a Class by name or the number of fields in a class (nor a for-each-field form).

(Class-field class index)        ; Class * nat -> Field
(Field? value)                   ; anySchemeValue -> boolean
(Field-name field)               ; Field -> symbol


[4]=========

The setter syntax for fields differs from that of other Scheme forms, which take the new value as the last parameter.


(set-field-value! object value field [ index ]) ;; proposed
; Object * value * Field [* nat] -> unspecified


e.g. records:

(record-set! <record> <index> <value>) -> <unspecific>

e.g. generalized setters:

(set! (proc arg ...) value)


[5]=========

"The next method is defined to be the method that would have been invoked if the current method was absent. It is forbidden to define ambiguous multi-method that is a method that will make some signature ambiguous."

I would prefer a definition similar to Dylan's "more specific" multi-method specificity rules.


End of proposal comments..
====================================================================
ASIDE: comments on Meroon V3:

[A]=========

The 'co-instantiate' form has hidden side effects which I find dangerous.  I.e. in the example given 'p' and 'x' are side-effected.

I would prefer:

(define-values (p x)
  (with-co-instantiation
	((a TrucMuche :right x x x)
	 (b Point :x 22 :y (TrucMuche-left p)) )
	(values a b)))

to the example:

(define p 'junk)
(define x 'also-junk)
(co-instantiate   ;; side effects x and p
  ((p TrucMuche :right x x x)
   (x Point :x 22 :y (TrucMuche-left p)) )

[B]=========

I found Meroon to be fairly fragile.  E.g. I mistyped ":initialize" for ":initializer" in a define-class field specification with no error reported; I redefined a class which caused problems (as noted in the documentation).

====================================================================
Cheers,
-KenD