Skip to content

Commit 44f8c58

Browse files
authored
Merge pull request #204 from corywalker/corywalker
Support Take[].
2 parents a7a5a88 + f154f1b commit 44f8c58

File tree

4 files changed

+41
-0
lines changed

4 files changed

+41
-0
lines changed

expreduce/builtin_list.go

+1
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ func getListDefinitions() (defs []Definition) {
614614
return applied
615615
},
616616
})
617+
defs = append(defs, Definition{Name: "Take"})
617618
defs = append(defs, Definition{Name: "Span"})
618619
defs = append(defs, Definition{Name: "All"})
619620
defs = append(defs, Definition{

expreduce/evalstate.go

+2
Original file line numberDiff line numberDiff line change
@@ -556,12 +556,14 @@ func (es *EvalState) Define(lhs expreduceapi.Ex, rhs expreduceapi.Ex) {
556556
newSpecificity := ruleSpecificity(heldLHS, rhs, name, es)
557557
for i, dv := range es.defined.GetDef(name).Downvalues {
558558
if dv.Specificity == 0 {
559+
es.defined.LockKey(name)
559560
dv.Specificity = ruleSpecificity(
560561
dv.Rule.GetParts()[1],
561562
dv.Rule.GetParts()[2],
562563
name,
563564
es,
564565
)
566+
es.defined.UnlockKey(name)
565567
}
566568
if dv.Specificity < newSpecificity {
567569
newRule := atoms.NewExpression(

expreduce/resources.go

+19
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

expreduce/resources/list.m

+19
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,25 @@
228228
]
229229
};
230230

231+
Take::usage = "`Take[list, m]` returns the first `m` items of `list`.";
232+
Take[list_, m_] := If[m > 0, list[[1;;m]], list[[m;;-1]]];
233+
Take[list_, {m_, n_}] := list[[m;;n]];
234+
Take[list_, {m_, n_, o_}] := list[[m;;n;;o]];
235+
Attributes[Take] = {NHoldRest, Protected};
236+
Tests`Take = {
237+
ESimpleExamples[
238+
EComment["Return the first two items in a list:"],
239+
ESameTest[{1, 2}, Take[{1, 2, 3, 4}, 2]],
240+
EComment["Return a range from the middle of a list:"],
241+
ESameTest[{2, 3, 4}, Take[{1, 2, 3, 4, 5}, {2, 4}]]
242+
], EKnownFailures[
243+
(* Return the last 2 items in a list: *)
244+
ESameTest[{3, 4}, Take[{1, 2, 3, 4}, -2]],
245+
(* Take every other item: *)
246+
ESameTest[{1, 3, 5}, Take[{1, 2, 3, 4, 5}, {1, -1, 2}]]
247+
]
248+
};
249+
231250
Span::usage = "`start ;; end` represents an index span to select using Part.";
232251
Attributes[Span] = {Protected};
233252
Tests`Span = {

0 commit comments

Comments
 (0)