Skip to content

Commit e1a578a

Browse files
committed
Improve the implementation of todo! to use the new elaboration system
1 parent 82e1474 commit e1a578a

File tree

6 files changed

+67
-31
lines changed

6 files changed

+67
-31
lines changed

hackett-lib/hackett/prelude.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
hackett/data/list
77
hackett/data/maybe
88
hackett/monad/base
9+
hackett/todo
910

1011
(prefix-in prim: hackett/private/prim)
1112
hackett/private/prim
@@ -14,6 +15,7 @@
1415
(provide (all-from-out hackett/data/either)
1516
(all-from-out hackett/data/list)
1617
(all-from-out hackett/data/maybe)
18+
(all-from-out hackett/todo)
1719

1820
(data Unit) (data Bool) (data Tuple) (data Maybe) (data Either) (data List)
1921
|| && not if fst snd

hackett-lib/hackett/private/base.rkt

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
@%superclasses-key @%dictionary-placeholder @%with-dictionary
2828
define-primop define-base-type
2929
-> Integer Double String Bytes
30-
: λ1 def let letrec todo!)
30+
: λ1 def let letrec)
3131

3232
(define-base-type Integer)
3333
(define-base-type Double)
@@ -444,33 +444,6 @@
444444
(attribute fixity.fixity))
445445
(define- #,id- #,e-))))])
446446

447-
(begin-for-syntax
448-
(struct todo-item (full summary) #:prefab))
449-
450-
(define-syntax todo!*
451-
(make-elaborating-transformer
452-
(syntax-parser
453-
[(_ v e ...)
454-
(match (syntax-local-elaborate-pass)
455-
[(or 'expand 'elaborate)
456-
(syntax-local-elaborate-defer this-syntax)]
457-
['finalize
458-
(let* ([type-str (type->string (apply-current-subst #'(#%type:wobbly-var v)))]
459-
[message (string-append (source-location->prefix this-syntax)
460-
"todo! with type "
461-
type-str)])
462-
(syntax-property (quasisyntax/loc this-syntax (error '#,message))
463-
'todo (todo-item type-str type-str)))])])))
464-
465-
(define-syntax todo!
466-
(make-elaborating-transformer
467-
#:allowed-passes '[expand]
468-
(syntax-parser
469-
[(_ e ...)
470-
#:with var (generate-temporary #'t_todo!)
471-
(attach-type (syntax-local-elaborate-defer (syntax/loc this-syntax (todo!* var e ...)))
472-
#'(#%type:wobbly-var var))])))
473-
474447
(define-syntax let1
475448
(make-trampolining-expression-transformer
476449
(syntax-parser
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#lang racket/base
2+
3+
(require (for-syntax racket/base
4+
racket/contract
5+
racket/match
6+
racket/syntax
7+
8+
hackett/private/expand+elaborate)
9+
syntax/parse/define
10+
11+
hackett/private/base)
12+
13+
(provide (for-syntax make-expected-type-transformer))
14+
15+
(define-syntax deferred-expected-type-transformer
16+
(make-elaborating-transformer
17+
(syntax-parser
18+
[(_ expected-type proc orig-stx)
19+
(match (syntax-local-elaborate-pass)
20+
[(or 'expand 'elaborate)
21+
(attach-type (syntax-local-elaborate-defer this-syntax) #'expected-type)]
22+
['finalize
23+
(τ⇐! #'(do-expected-type-transformer proc orig-stx) #'expected-type)])])))
24+
25+
(define-syntax do-expected-type-transformer
26+
(make-elaborating-transformer
27+
#:allowed-passes '[finalize]
28+
(syntax-parser
29+
[(_ proc orig-stx)
30+
((syntax-e #'proc)
31+
(attach-expected #'orig-stx (apply-current-subst (get-expected this-syntax))))])))
32+
33+
(begin-for-syntax
34+
(define/contract (make-expected-type-transformer proc)
35+
(-> (-> syntax? syntax?) (-> syntax? syntax?))
36+
(make-elaborating-transformer
37+
(λ (stx) (let ([expected-type #`(#%type:wobbly-var #,(generate-temporary))])
38+
#`(deferred-expected-type-transformer #,expected-type #,proc #,stx))))))

hackett-lib/hackett/private/kernel.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
[λ lambda])
2121
#%require/only-types combine-in except-in only-in prefix-in rename-in
2222
provide combine-out except-out prefix-out rename-out for-type module+
23-
: def λ let letrec todo!
23+
: def λ let letrec
2424
(for-type #:no-introduce-> => Integer Double String Bytes
2525
(rename-out [@%top #%top]
2626
[#%type:app #%app]

hackett-lib/hackett/private/type-language.rkt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,9 @@
195195
(syntax-track-origin #'t-.residual #'head)
196196
(syntax-track-origin #'expansion #'head))])
197197

198-
(define (expand-type stx [intdef-ctx #f])
198+
(define (expand-type stx [intdef-ctx #f] #:context [context 'expand-type])
199199
(syntax-parse stx
200-
#:context 'expand-type
200+
#:context context
201201
[{~var t (type intdef-ctx)} #'t.expansion]))
202202

203203
;; ---------------------------------------------------------------------------------------------------

hackett-lib/hackett/todo.rkt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#lang hackett/base
2+
3+
(require (only-in racket/base define-syntax for-syntax)
4+
(for-syntax racket/base
5+
syntax/srcloc
6+
hackett/private/typecheck)
7+
syntax/parse/define
8+
9+
hackett/private/deferred-transformer
10+
(only-in hackett/private/prim error!))
11+
12+
(provide todo!)
13+
14+
(define-syntax todo!
15+
(make-expected-type-transformer
16+
(syntax-parser
17+
[(_ e ...)
18+
(let* ([type-str (type->string (get-expected this-syntax))]
19+
[message (string-append (source-location->prefix this-syntax)
20+
"todo! with type "
21+
type-str)])
22+
(syntax-property (quasisyntax/loc this-syntax (error! #,message))
23+
'todo `#s(todo-item ,type-str ,type-str)))])))

0 commit comments

Comments
 (0)