From 2295f2c8e7c616a100f66e1b0756e6468c14dd45 Mon Sep 17 00:00:00 2001 From: jake bolewski Date: Fri, 2 Jan 2015 20:56:50 -0500 Subject: [PATCH] Consistently parse A <: B as a Expr(:comparison, A, :(<:), B) Should fix #9503 This is a backwards incompatible change, note that before ```julia type A <: B end ``` would be parsed as: ```julia Expr(:type, true, Expr(:(<:), :A, :B), Expr(:block,)) ``` now it is parsed as ```julia Expr(:type, true, Expr(:comparison, :A, :(<:), :B), Expr(:block,)) ``` chained subtype comparisons for type/immutable are still disallowed ```julia type A <: B <: C end ``` --- NEWS.md | 2 ++ base/multidimensional.jl | 2 +- src/julia-parser.scm | 11 ++--------- src/julia-syntax.scm | 26 ++++++++++++++------------ 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/NEWS.md b/NEWS.md index 81f33a5089c5a..42545e6ccc52e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -30,6 +30,8 @@ New language features Language changes ---------------- + * `A <: B` is parsed consistently as `Expr(:comparison, :A, :(<:), :B)` ([#9582]). + * `Uint` et al. are now spelled `UInt` ([#8905]). * `String` has been renamed to `AbstractString` ([#8872]). diff --git a/base/multidimensional.jl b/base/multidimensional.jl index 4645dbf11c0e2..0bec4cb7166a3 100644 --- a/base/multidimensional.jl +++ b/base/multidimensional.jl @@ -32,7 +32,7 @@ function gen_cartesian(N::Int) if !in(N,implemented) fieldnames = [symbol("I_$i") for i = 1:N] fields = [Expr(:(::), fieldnames[i], :Int) for i = 1:N] - extype = Expr(:type, false, Expr(:(<:), indextype, Expr(:curly, :CartesianIndex, N)), Expr(:block, fields...)) + extype = Expr(:type, false, Expr(:comparison, indextype, :(<:), Expr(:curly, :CartesianIndex, N)), Expr(:block, fields...)) exindices = Expr[:(index[$i]) for i = 1:N] totalex = quote # type definition of state diff --git a/src/julia-parser.scm b/src/julia-parser.scm index 006da6322394e..0b29962194f3f 100644 --- a/src/julia-parser.scm +++ b/src/julia-parser.scm @@ -881,13 +881,6 @@ (else ex))))) -;; convert (comparison a <: b) to (<: a b) -(define (subtype-syntax e) - (if (and (pair? e) (eq? (car e) 'comparison) - (length= e 4) (eq? (caddr e) '|<:|)) - `(<: ,(cadr e) ,(cadddr e)) - e)) - (define (parse-unary-prefix s) (let ((op (peek-token s))) (if (syntactic-unary-op? op) @@ -987,7 +980,7 @@ (loop (list t ex))) ((#\{ ) (take-token s) (loop (list* 'curly ex - (map subtype-syntax (parse-arglist s #\} ))))) + (parse-arglist s #\} )))) ((#\") (if (and (symbol? ex) (not (operator? ex)) (not (ts:space? s))) @@ -1022,7 +1015,7 @@ " expected \"end\", got \"" t "\"")))))) (define (parse-subtype-spec s) - (subtype-syntax (parse-comparison s))) + (parse-comparison s)) ; parse expressions or blocks introduced by syntactic reserved words (define (parse-resword s word) diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index 4448ad853d5ec..2fc574cfde8d9 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -404,8 +404,9 @@ (define (sparam-name sp) (cond ((symbol? sp) sp) - ((and (length= sp 3) - (eq? (car sp) '|<:|) + ((and (length= sp 4) + (eq? (car sp) 'comparison) + (eq? (undot-name (caddr sp)) '<:) (symbol? (cadr sp))) (cadr sp)) (else (error "malformed type parameter list")))) @@ -416,11 +417,12 @@ ((symbol? (car sparams)) (sparam-name-bounds (cdr sparams) (cons (car sparams) names) (cons '(top Any) bounds))) - ((and (length= (car sparams) 3) - (eq? (caar sparams) '|<:|) + ((and (length= (car sparams) 4) + (eq? (caar sparams) 'comparison) + (eq? (undot-name (caddar sparams)) '<:) (symbol? (cadar sparams))) (sparam-name-bounds (cdr sparams) (cons (cadr (car sparams)) names) - (cons (caddr (car sparams)) bounds))) + (cons (cadddr (car sparams)) bounds))) (else (error "malformed type parameter list")))) @@ -746,7 +748,7 @@ (define (default-outer-ctor name field-names field-types params bounds) (let ((field-names (safe-field-names field-names field-types))) `(function (call (curly ,name - ,@(map (lambda (p b) `(<: ,p ,b)) + ,@(map (lambda (p b) `(comparison ,p <: ,b)) params bounds)) ,@(map make-decl field-names field-types)) (block @@ -804,7 +806,7 @@ ,@(arglist-unshift sig `(|::| ,(gensy) (curly Type ,name)))) params)) (if (null? method-params) - (cons `(call (curly call ,@(map (lambda (p b) `(<: ,p ,b)) params bounds)) + (cons `(call (curly call ,@(map (lambda (p b) `(comparison ,p <: ,b)) params bounds)) ,@(arglist-unshift sig `(|::| ,(gensy) (curly Type (curly ,name ,@params))))) params) ;; rename parameters that conflict with user-written method parameters @@ -812,7 +814,7 @@ (gensy) p)) params))) - (cons `(call (curly call ,@(map (lambda (p b) `(<: ,p ,b)) new-params bounds) + (cons `(call (curly call ,@(map (lambda (p b) `(comparison ,p <: ,b)) new-params bounds) ,@method-params) ,@(arglist-unshift sig `(|::| ,(gensy) (curly Type (curly ,name ,@new-params))))) new-params))))) @@ -972,9 +974,9 @@ (values name '() 'Any)) ex) ((pattern-lambda (curly (-- name (-s)) . params) (values name params 'Any)) ex) - ((pattern-lambda (|<:| (-- name (-s)) super) + ((pattern-lambda (comparison (-- name (-s)) <: super) (values name '() super)) ex) - ((pattern-lambda (|<:| (curly (-- name (-s)) . params) super) + ((pattern-lambda (comparison (curly (-- name (-s)) . params) <: super) (values name params super)) ex) (error "invalid type signature"))) @@ -1360,13 +1362,13 @@ (if var (list 'varlist var) '())) ;; type definition - (pattern-lambda (type mut (<: (curly tn . tvars) super) body) + (pattern-lambda (type mut (comparison (curly tn . tvars) <: super) body) (list* 'varlist (cons (unescape tn) (unescape tn)) '(new . new) (map typevar-expr-name tvars))) (pattern-lambda (type mut (curly tn . tvars) body) (list* 'varlist (cons (unescape tn) (unescape tn)) '(new . new) (map typevar-expr-name tvars))) - (pattern-lambda (type mut (<: tn super) body) + (pattern-lambda (type mut (comparison tn <: super) body) (list 'varlist (cons (unescape tn) (unescape tn)) '(new . new))) (pattern-lambda (type mut tn body) (list 'varlist (cons (unescape tn) (unescape tn)) '(new . new)))