Skip to content

Commit b233b13

Browse files
committed
Let satisfies? and instance? both take seqables as their first argument.
This time this is implemented in pixie code.
1 parent 4ba33b2 commit b233b13

6 files changed

Lines changed: 44 additions & 20 deletions

File tree

pixie/stdlib.pxi

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,30 @@
164164
(def reduce (fn [rf init col]
165165
(-reduce col rf init)))
166166

167+
(def instance? (fn ^{:doc "Checks if x is an instance of t.
168+
169+
When t is seqable, checks if x is an instance of
170+
any of the types contained therein."}
171+
instance? [t x]
172+
(if (-satisfies? ISeqable t)
173+
(let [ts (seq t)]
174+
(if (not ts) false
175+
(or (-instance? (first ts) x)
176+
(instance? (rest ts) x))))
177+
(-instance? t x))))
178+
179+
(def satisfies? (fn ^{:doc "Checks if x satisfies the protocol p.
180+
181+
When p is seqable, checks if x satisfies all of
182+
the protocols contained therein."}
183+
satisfies? [p x]
184+
(if (-satisfies? ISeqable p)
185+
(let [ps (seq p)]
186+
(if (not ps) true
187+
(and (-satisfies? (first ps) x)
188+
(satisfies? (rest ps) x))))
189+
(-satisfies? p x))))
190+
167191
(def into (fn ^{:doc "Add the elements of `from` to the collection `to`."
168192
:signatures [[to from]]
169193
:added "0.1"}

pixie/vm/compiler.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ def compile_form(form, ctx):
353353
ctx.push_const(nil)
354354
return
355355

356-
if rt.satisfies_QMARK_(rt.ISeq.deref(), form) and form is not nil:
356+
if rt._satisfies_QMARK_(rt.ISeq.deref(), form) and form is not nil:
357357
form = macroexpand(form)
358358
return compile_cons(form, ctx)
359359
if isinstance(form, numbers.Integer):
@@ -425,7 +425,7 @@ def compile_form(form, ctx):
425425
compile_set_literal(form, ctx)
426426
return
427427

428-
if rt.satisfies_QMARK_(rt.IMap.deref(), form):
428+
if rt._satisfies_QMARK_(rt.IMap.deref(), form):
429429
compile_map_literal(form, ctx)
430430
return
431431

@@ -480,7 +480,7 @@ def compile_fn(form, ctx):
480480

481481

482482

483-
if rt.satisfies_QMARK_(rt.ISeq.deref(), rt.first(form)):
483+
if rt._satisfies_QMARK_(rt.ISeq.deref(), rt.first(form)):
484484
arities = []
485485
while form is not nil:
486486
required_arity, argc = compile_fn_body(name, rt.first(rt.first(form)), rt.next(rt.first(form)), ctx)

pixie/vm/libs/pxic/writer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,11 @@ def write_object(obj, wtr):
255255
elif isinstance(obj, Var):
256256
#wtr.write_cached_obj(obj, write_var)
257257
write_var(obj, wtr)
258-
elif rt.satisfies_QMARK_(rt.IMap.deref(), obj):
258+
elif rt._satisfies_QMARK_(rt.IMap.deref(), obj):
259259
write_map(obj, wtr)
260-
elif rt.satisfies_QMARK_(rt.IVector.deref(), obj):
260+
elif rt._satisfies_QMARK_(rt.IVector.deref(), obj):
261261
write_vector(obj, wtr)
262-
elif rt.satisfies_QMARK_(rt.ISeq.deref(), obj):
262+
elif rt._satisfies_QMARK_(rt.ISeq.deref(), obj):
263263
write_seq(obj, wtr)
264264
elif isinstance(obj, Keyword):
265265
wtr.write_cached_obj(obj, write_keyword)

pixie/vm/persistent_vector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ def _eq(self, obj):
456456
return false
457457
return true
458458
else:
459-
if obj is nil or not rt.satisfies_QMARK_(proto.ISeqable, obj):
459+
if obj is nil or not rt._satisfies_QMARK_(proto.ISeqable, obj):
460460
return false
461461
seq = rt.seq(obj)
462462
for i in range(0, intmask(self._cnt)):

pixie/vm/reader.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,12 +449,12 @@ def invoke(self, rdr, ch):
449449
LIST = symbol(u"list")
450450

451451
def is_unquote(form):
452-
return True if rt.satisfies_QMARK_(rt.ISeq.deref(), form) \
452+
return True if rt._satisfies_QMARK_(rt.ISeq.deref(), form) \
453453
and rt.eq(rt.first(form), UNQUOTE) \
454454
else False
455455

456456
def is_unquote_splicing(form):
457-
return True if rt.satisfies_QMARK_(rt.ISeq.deref(), form) \
457+
return True if rt._satisfies_QMARK_(rt.ISeq.deref(), form) \
458458
and rt.eq(rt.first(form), UNQUOTE_SPLICING) \
459459
else False
460460

@@ -537,7 +537,7 @@ def invoke(self, rdr, ch):
537537
if isinstance(meta, Symbol):
538538
meta = rt.hashmap(keyword(u"tag"), meta)
539539

540-
if rt.satisfies_QMARK_(rt.IMeta.deref(), obj):
540+
if rt._satisfies_QMARK_(rt.IMeta.deref(), obj):
541541
return rt.with_meta(obj, rt.merge(meta, rt.meta(obj)))
542542

543543
return obj

pixie/vm/stdlib.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def default_hash(x):
121121

122122
@as_var("first")
123123
def first(x):
124-
if rt.satisfies_QMARK_(ISeq, x):
124+
if rt._satisfies_QMARK_(ISeq, x):
125125
return rt._first(x)
126126

127127
seq = rt.seq(x)
@@ -131,7 +131,7 @@ def first(x):
131131

132132
@as_var("next")
133133
def next(x):
134-
if rt.satisfies_QMARK_(ISeq, x):
134+
if rt._satisfies_QMARK_(ISeq, x):
135135
return rt.seq(rt._next(x))
136136
seq = rt.seq(x)
137137
if seq is nil:
@@ -145,15 +145,15 @@ def seq(x):
145145

146146
@as_var("seq?")
147147
def seq_QMARK_(x):
148-
return true if rt.satisfies_QMARK_(rt.ISeq.deref(), x) else false
148+
return true if rt._satisfies_QMARK_(rt.ISeq.deref(), x) else false
149149

150150
@as_var("-seq-eq")
151151
def _seq_eq(a, b):
152152
if a is b:
153153
return true
154154
if a is nil or b is nil:
155155
return false
156-
if not (rt.satisfies_QMARK_(rt.ISeqable.deref(), b) or rt.satisfies_QMARK_(rt.ISeq.deref(), b)):
156+
if not (rt._satisfies_QMARK_(rt.ISeqable.deref(), b) or rt._satisfies_QMARK_(rt.ISeq.deref(), b)):
157157
return false
158158

159159
a = rt.seq(a)
@@ -286,7 +286,7 @@ def __with_meta(a, b):
286286
@returns(bool)
287287
@as_var("has-meta?")
288288
def __has_meta(a):
289-
return true if rt.satisfies_QMARK_(rt.IMeta.deref(), a) else false
289+
return true if rt._satisfies_QMARK_(rt.IMeta.deref(), a) else false
290290

291291
@as_var("conj")
292292
def conj(a, b):
@@ -313,8 +313,8 @@ def str__args(args):
313313
@jit.unroll_safe
314314
def apply__args(args):
315315
last_itm = args[len(args) - 1]
316-
if not (rt.satisfies_QMARK_(rt.IIndexed.deref(), last_itm) and
317-
rt.satisfies_QMARK_(rt.ICounted.deref(), last_itm)):
316+
if not (rt._satisfies_QMARK_(rt.IIndexed.deref(), last_itm) and
317+
rt._satisfies_QMARK_(rt.ICounted.deref(), last_itm)):
318318
last_itm = rt.vec(last_itm)
319319

320320
fn = args[0]
@@ -335,14 +335,14 @@ def apply__args(args):
335335
# return nil
336336

337337
@returns(bool)
338-
@as_var("instance?")
338+
@as_var("-instance?")
339339
def _instance(c, o):
340340
affirm(isinstance(c, Type), u"c must be a type")
341341

342342
return true if istypeinstance(o, c) else false
343343

344344
@returns(bool)
345-
@as_var("satisfies?")
345+
@as_var("-satisfies?")
346346
def _satisfies(proto, o):
347347
affirm(isinstance(proto, Protocol), u"proto must be a Protocol")
348348

@@ -625,7 +625,7 @@ def identical(a, b):
625625

626626
@as_var("vector?")
627627
def vector_QMARK_(a):
628-
return true if rt.satisfies_QMARK_(rt.IVector.deref(), a) else false
628+
return true if rt._satisfies_QMARK_(rt.IVector.deref(), a) else false
629629

630630
@returns(bool)
631631
@as_var("eq")

0 commit comments

Comments
 (0)