Type strategy for Scheme
Lassi Kortela
(09 Nov 2022 22:54 UTC)
|
Re: Type strategy for Scheme
Marc Nieper-Wißkirchen
(10 Nov 2022 07:07 UTC)
|
Re: Type strategy for Scheme
Marc Nieper-Wißkirchen
(10 Nov 2022 07:42 UTC)
|
Re: Type strategy for Scheme
Peter Bex
(10 Nov 2022 08:05 UTC)
|
Re: Type strategy for Scheme
Philip McGrath
(10 Nov 2022 08:54 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(10 Nov 2022 09:49 UTC)
|
Re: Type strategy for Scheme Lassi Kortela (10 Nov 2022 09:08 UTC)
|
Re: Type strategy for Scheme
Marc Feeley
(10 Nov 2022 23:34 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(11 Nov 2022 19:17 UTC)
|
Re: Type strategy for Scheme
Marc Feeley
(11 Nov 2022 21:34 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(12 Nov 2022 21:58 UTC)
|
Re: Type strategy for Scheme
Marc Nieper-Wißkirchen
(12 Nov 2022 22:52 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(12 Nov 2022 23:14 UTC)
|
Re: Type strategy for Scheme
Marc Nieper-Wißkirchen
(13 Nov 2022 09:41 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(13 Nov 2022 11:59 UTC)
|
Re: Type strategy for Scheme
John Cowan
(13 Nov 2022 19:52 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(13 Nov 2022 20:22 UTC)
|
Re: Type strategy for Scheme
Marc Nieper-Wißkirchen
(13 Nov 2022 20:35 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(13 Nov 2022 21:41 UTC)
|
Re: Type strategy for Scheme
Marc Feeley
(14 Nov 2022 00:03 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(14 Nov 2022 09:36 UTC)
|
Re: Type strategy for Scheme
Marc Feeley
(14 Nov 2022 16:27 UTC)
|
Re: Type strategy for Scheme
Lassi Kortela
(14 Nov 2022 19:58 UTC)
|
Re: Type strategy for Scheme
John Cowan
(13 Nov 2022 20:40 UTC)
|
Re: Type strategy for Scheme
Marc Nieper-Wißkirchen
(13 Nov 2022 20:42 UTC)
|
Re: Type strategy for Scheme
Panicz Maciej Godek
(20 Nov 2022 21:59 UTC)
|
Re: Type strategy for Scheme
Per Bothner
(20 Nov 2022 22:58 UTC)
|
> Starting by trying to describe types for what's already in Scheme > sounds like a good idea. I would start with the basics: > > Be creative and try to think of what should be the types of the > following expressions: Great! You're using exactly the kind of approach I had in mind. > + In a Hindley-Milner style system, where we don't have varargs, this should be two procedures: (unary+ z) (binary+ z z) and a macro: (+ z ...) With three or more arguments, the macro folds into calls to binary+. Similar approach works for *, append, vector-append, string-append, etc. - and / can use this too, but the zero-arg version may not make sense. > 0 I suggest: 0 : integer (or fixnum?) (expt 2 64) : integer (or bignum?) 0.0 : real xxxxxx@0 : complex > #i0 real (does any current Scheme implementation support inexact integers?) > (<operator> <operand> ...) A vararg procedure? AFAICT the vararg case has to be a macro in H-M. Haskell can emulate varargs using typeclass magic: https://wiki.haskell.org/Varargs Racket uses: (* z ...) → number? where z : number? > (<keyword> <datum> ...) I.e. macro? The macro layer can use dynamically typed Scheme, or a statically typed language where SchemeDatum is an implementation-defined type covering all permitted datum types. > call/cc No idea. Maybe calling a continuation can be treated as an effect, and hence the result has unit type? > (lambda (x) > "converts seconds to minutes" > (/ x 60)) The "60" would coerce this into the integer version of / probably. > (raise (make-assertion-violation)) Effect, so unit type. > (case-lambda > [() 42] > [(x) (when (symbol=? 'x 'german) "zweiundvierzig"]) Either (define-syntax my-thing (syntax-rules () ((my-thing) 42) ((my-thing x) (if (symbol=? x 'german) (just "zweiundvierzig") (nothing))))) or (define-union-type integer-or-string (the-integer integer) (the-string string)) (lambda (x) (match x ((nothing) (just (the-integer 42))) ((just x) (if (symbol=? x 'german) (just (the-string "zweiundvierzig")) (nothing))))) > (let* () > (define-record-type pair (fields x y)) > make-pair) (define-type-alias (pair 'a 'b) (record (x 'a) (y 'b))) make-pair : (-> 'a 'b (pair 'a 'b)) > (values 1 2 3) (values integer integer integer) > values Multiple values should probably be a tuple in H-M. values cannot be a procedure in H-M, it has to be syntax. > "string" string Note that string can be an abstract data type which is either an opaque primitive type or (vector 'char). > (string-copy "string") (-> string string) when the effect is not part of the type.