|
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.