@@ -101,6 +101,9 @@ public final class DrawingLibrary: NativeLibrary {
101101
102102 /// Dependencies of the library.
103103 public override func dependencies( ) {
104+ self . `import` ( from: [ " lispkit " , " core " ] , " define-syntax " , " syntax-rules " )
105+ self . `import` ( from: [ " lispkit " , " control " ] , " let " )
106+ self . `import` ( from: [ " lispkit " , " dynamic " ] , " parameterize " )
104107 self . `import` ( from: [ " lispkit " , " system " ] , " current-directory " )
105108 }
106109
@@ -180,11 +183,61 @@ public final class DrawingLibrary: NativeLibrary {
180183 self . define ( Procedure ( " font " , font) )
181184 self . define ( Procedure ( " font-name " , fontName) )
182185 self . define ( Procedure ( " font-size " , fontSize) )
186+ self . define ( Procedure ( " point? " , isPoint) )
183187 self . define ( Procedure ( " point " , point) )
188+ self . define ( Procedure ( " point-x " , pointX) )
189+ self . define ( Procedure ( " point-y " , pointY) )
190+ self . define ( Procedure ( " size? " , isSize) )
184191 self . define ( Procedure ( " size " , size) )
192+ self . define ( Procedure ( " size-width " , sizeWidth) )
193+ self . define ( Procedure ( " size-height " , sizeHeight) )
194+ self . define ( Procedure ( " rect? " , isRect) )
185195 self . define ( Procedure ( " rect " , rect) )
186196 self . define ( Procedure ( " rect-point " , rectPoint) )
187197 self . define ( Procedure ( " rect-size " , rectSize) )
198+ self . define ( Procedure ( " rect-x " , rectX) )
199+ self . define ( Procedure ( " rect-y " , rectY) )
200+ self . define ( Procedure ( " rect-width " , rectWidth) )
201+ self . define ( Procedure ( " rect-height " , rectHeight) )
202+
203+ // Syntax definitions
204+ self . define ( " drawing " , via: """
205+ (define-syntax drawing
206+ (syntax-rules ()
207+ ((_ body ...)
208+ (let ((d (make-drawing)))
209+ (parameterize ((current-drawing d)) body ...)
210+ d))))
211+ """ )
212+ self . define ( " with-drawing " , via: """
213+ (define-syntax with-drawing
214+ (syntax-rules ()
215+ ((_ d body ...)
216+ (parameterize ((current-drawing d)) body ...))))
217+ """ )
218+ self . define ( " transform " , via: """
219+ (define-syntax transform
220+ (syntax-rules ()
221+ ((_ tf body ...)
222+ (let ((t tf))
223+ (enable-transformation t)
224+ body ...
225+ (disable-transformation t)))))
226+ """ )
227+ self . define ( " shape " , via: """
228+ (define-syntax shape
229+ (syntax-rules ()
230+ ((_ body ...)
231+ (let ((s (make-shape)))
232+ (parameterize ((current-shape s)) body ...)
233+ s))))
234+ """ )
235+ self . define ( " with-shape " , via: """
236+ (define-syntax with-shape
237+ (syntax-rules ()
238+ ((_ s body ...)
239+ (parameterize ((current-shape s)) body ...))))
240+ """ )
188241 }
189242
190243 public override func initializations( ) {
@@ -1045,18 +1098,67 @@ public final class DrawingLibrary: NativeLibrary {
10451098
10461099 // Fonts/points/sizes/rects
10471100
1101+ private func isPoint( expr: Expr ) throws -> Expr {
1102+ guard case . pair( . flonum( _) , . flonum( _) ) = expr else {
1103+ return . false
1104+ }
1105+ return . true
1106+ }
1107+
10481108 private func point( xc: Expr , yc: Expr ) throws -> Expr {
10491109 let x = try xc. asDouble ( coerce: true )
10501110 let y = try yc. asDouble ( coerce: true )
10511111 return . pair( . flonum( x) , . flonum( y) )
10521112 }
10531113
1114+ private func pointX( expr: Expr ) throws -> Expr {
1115+ guard case . pair( . flonum( let x) , . flonum( _) ) = expr else {
1116+ throw RuntimeError . eval ( . invalidPoint, expr)
1117+ }
1118+ return . flonum( x)
1119+ }
1120+
1121+ private func pointY( expr: Expr ) throws -> Expr {
1122+ guard case . pair( . flonum( _) , . flonum( let y) ) = expr else {
1123+ throw RuntimeError . eval ( . invalidPoint, expr)
1124+ }
1125+ return . flonum( y)
1126+ }
1127+
1128+ private func isSize( expr: Expr ) throws -> Expr {
1129+ guard case . pair( . flonum( _) , . flonum( _) ) = expr else {
1130+ return . false
1131+ }
1132+ return . true
1133+ }
1134+
10541135 private func size( wc: Expr , hc: Expr ) throws -> Expr {
10551136 let w = try wc. asDouble ( coerce: true )
10561137 let h = try hc. asDouble ( coerce: true )
10571138 return . pair( . flonum( w) , . flonum( h) )
10581139 }
10591140
1141+ private func sizeWidth( expr: Expr ) throws -> Expr {
1142+ guard case . pair( . flonum( let w) , . flonum( _) ) = expr else {
1143+ throw RuntimeError . eval ( . invalidSize, expr)
1144+ }
1145+ return . flonum( w)
1146+ }
1147+
1148+ private func sizeHeight( expr: Expr ) throws -> Expr {
1149+ guard case . pair( . flonum( _) , . flonum( let h) ) = expr else {
1150+ throw RuntimeError . eval ( . invalidSize, expr)
1151+ }
1152+ return . flonum( h)
1153+ }
1154+
1155+ private func isRect( expr: Expr ) throws -> Expr {
1156+ guard case . pair( . pair( . flonum( _) , . flonum( _) ) , . pair( . flonum( _) , . flonum( _) ) ) = expr else {
1157+ return . false
1158+ }
1159+ return . true
1160+ }
1161+
10601162 private func rect( fst: Expr , snd: Expr , thrd: Expr ? , fth: Expr ? ) throws -> Expr {
10611163 if let width = thrd {
10621164 let x = try fst. asDouble ( coerce: true )
@@ -1089,6 +1191,20 @@ public final class DrawingLibrary: NativeLibrary {
10891191 return point
10901192 }
10911193
1194+ private func rectX( expr: Expr ) throws -> Expr {
1195+ guard case . pair( . pair( . flonum( let x) , . flonum( _) ) , . pair( . flonum( _) , . flonum( _) ) ) = expr else {
1196+ throw RuntimeError . eval ( . invalidRect, expr)
1197+ }
1198+ return . flonum( x)
1199+ }
1200+
1201+ private func rectY( expr: Expr ) throws -> Expr {
1202+ guard case . pair( . pair( . flonum( _) , . flonum( let y) ) , . pair( . flonum( _) , . flonum( _) ) ) = expr else {
1203+ throw RuntimeError . eval ( . invalidRect, expr)
1204+ }
1205+ return . flonum( y)
1206+ }
1207+
10921208 private func rectSize( expr: Expr ) throws -> Expr {
10931209 guard case . pair( . pair( . flonum( _) , . flonum( _) ) , let size) = expr else {
10941210 throw RuntimeError . eval ( . invalidRect, expr)
@@ -1099,6 +1215,20 @@ public final class DrawingLibrary: NativeLibrary {
10991215 return size
11001216 }
11011217
1218+ private func rectWidth( expr: Expr ) throws -> Expr {
1219+ guard case . pair( . pair( . flonum( _) , . flonum( _) ) , . pair( . flonum( let w) , . flonum( _) ) ) = expr else {
1220+ throw RuntimeError . eval ( . invalidRect, expr)
1221+ }
1222+ return . flonum( w)
1223+ }
1224+
1225+ private func rectHeight( expr: Expr ) throws -> Expr {
1226+ guard case . pair( . pair( . flonum( _) , . flonum( _) ) , . pair( . flonum( _) , . flonum( let h) ) ) = expr else {
1227+ throw RuntimeError . eval ( . invalidRect, expr)
1228+ }
1229+ return . flonum( h)
1230+ }
1231+
11021232 private func isFont( expr: Expr ) -> Expr {
11031233 if case . object( let obj) = expr, obj is ImmutableBox < NSFont > {
11041234 return . true
0 commit comments