@@ -101,6 +101,9 @@ public final class DrawingLibrary: NativeLibrary {
101
101
102
102
/// Dependencies of the library.
103
103
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 " )
104
107
self . `import` ( from: [ " lispkit " , " system " ] , " current-directory " )
105
108
}
106
109
@@ -180,11 +183,61 @@ public final class DrawingLibrary: NativeLibrary {
180
183
self . define ( Procedure ( " font " , font) )
181
184
self . define ( Procedure ( " font-name " , fontName) )
182
185
self . define ( Procedure ( " font-size " , fontSize) )
186
+ self . define ( Procedure ( " point? " , isPoint) )
183
187
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) )
184
191
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) )
185
195
self . define ( Procedure ( " rect " , rect) )
186
196
self . define ( Procedure ( " rect-point " , rectPoint) )
187
197
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
+ """ )
188
241
}
189
242
190
243
public override func initializations( ) {
@@ -1045,18 +1098,67 @@ public final class DrawingLibrary: NativeLibrary {
1045
1098
1046
1099
// Fonts/points/sizes/rects
1047
1100
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
+
1048
1108
private func point( xc: Expr , yc: Expr ) throws -> Expr {
1049
1109
let x = try xc. asDouble ( coerce: true )
1050
1110
let y = try yc. asDouble ( coerce: true )
1051
1111
return . pair( . flonum( x) , . flonum( y) )
1052
1112
}
1053
1113
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
+
1054
1135
private func size( wc: Expr , hc: Expr ) throws -> Expr {
1055
1136
let w = try wc. asDouble ( coerce: true )
1056
1137
let h = try hc. asDouble ( coerce: true )
1057
1138
return . pair( . flonum( w) , . flonum( h) )
1058
1139
}
1059
1140
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
+
1060
1162
private func rect( fst: Expr , snd: Expr , thrd: Expr ? , fth: Expr ? ) throws -> Expr {
1061
1163
if let width = thrd {
1062
1164
let x = try fst. asDouble ( coerce: true )
@@ -1089,6 +1191,20 @@ public final class DrawingLibrary: NativeLibrary {
1089
1191
return point
1090
1192
}
1091
1193
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
+
1092
1208
private func rectSize( expr: Expr ) throws -> Expr {
1093
1209
guard case . pair( . pair( . flonum( _) , . flonum( _) ) , let size) = expr else {
1094
1210
throw RuntimeError . eval ( . invalidRect, expr)
@@ -1099,6 +1215,20 @@ public final class DrawingLibrary: NativeLibrary {
1099
1215
return size
1100
1216
}
1101
1217
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
+
1102
1232
private func isFont( expr: Expr ) -> Expr {
1103
1233
if case . object( let obj) = expr, obj is ImmutableBox < NSFont > {
1104
1234
return . true
0 commit comments