Iterators: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 645: | Line 645: | ||
(Except that this approach does not support negative indexing, so indexing from the end of a list would, for the general case, require either extending the system with explicit support for a length operation or iterating once over the list to determine the list length.) |
(Except that this approach does not support negative indexing, so indexing from the end of a list would, for the general case, require either extending the system with explicit support for a length operation or iterating once over the list to determine the list length.) |
||
=={{header|jq}}== |
|||
'''Works with both jq and gojq, the C and Go implementations of jq''' |
|||
In this entry, singly-linked lists (SLL) are represented |
|||
by JSON objects of the form `{item, next}`, that is by |
|||
objects with two keys, where `.item` is an item in |
|||
the list, and `.next` is the next SLL. |
|||
Since jq does not have an iterator interface, and since jq's array iterator is not extensible, |
|||
this entry defines a collection of polymorphic functions that will accept arrays or SLLs |
|||
as input, and that will produce identical results for equivalent inputs. |
|||
To highlight these functions, they will be named by using the prefix "poly_". |
|||
In particular, the function `poly_task` illustrates how all the |
|||
specified tasks for this page can be defined without reference to the input type, |
|||
with the results being the |
|||
same for equivalent inputs. |
|||
<syntaxhighlight lang=jq> |
|||
# Generic utilities |
|||
def count(s): reduce s as $x (0; .+1); |
|||
# A constructor for SLL: |
|||
def new($item): {$item, next: null}; |
|||
# Append a single item to an array or SLL. |
|||
# If the input is {} or a SLL, the output is a SLL |
|||
# If the input is null or an array, the output is an array |
|||
def append($item): |
|||
def a: if .next then .next |= a else .next=new($item) end; |
|||
if . == null then [$item] |
|||
elif . == {} then new($item) |
|||
else a |
|||
end; |
|||
# Append a stream of items using `append/1` |
|||
def append_items(stream): |
|||
reduce stream as $item (.; append($item)); |
|||
# Produce a stream of items |
|||
def poly_items: |
|||
if type == "array" then .[] |
|||
else .item, (select(.next).next|poly_items) |
|||
end; |
|||
def poly_length: |
|||
if type == "array" then length |
|||
else count(poly_items) |
|||
end; |
|||
# Output: the stream of items in reversed order |
|||
def poly_reversed: |
|||
if type == "array" then .[range(length-1; -1; -1)] |
|||
else [poly_items] | reverse[] |
|||
end; |
|||
# Two representations of Days of the Week (dow) and of colors: |
|||
def dow: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; |
|||
def sll_dow: {} | append_items(dow[]); |
|||
def colors: [ "red", "orange", "yellow", "green", "blue", "indigo", "violet"]; |
|||
def sll_colors: {} | append_items(colors[]); |
|||
def poly_task: |
|||
poly_length as $length |
|||
| "All the elements:", poly_items, |
|||
"", |
|||
"The first, fourth, and fifth elements:", |
|||
((0, 3, 4) as $i |
|||
| "For i=\($i): \(nth($i; poly_items))" ), |
|||
"", |
|||
"The last, fourth to last, and fifth to last elements:", |
|||
((0, 3, 4) as $i |
|||
| "For i=\($i): \(nth($i; poly_reversed) )" ); |
|||
"For days of the week:", |
|||
"For arrays:", (dow | poly_task), |
|||
"", |
|||
"For singly-linked lists:", (sll_dow | poly_task), |
|||
"\n", |
|||
"For colors:", |
|||
"For arrays:", (colors | poly_task), |
|||
"", |
|||
"For singly-linked lists:", (sll_colors | poly_task) |
|||
</syntaxhighlight> |
|||
{{output}} |
|||
<pre style="height:20lh;overflow:auto> |
|||
For days of the week: |
|||
For arrays: |
|||
All the elements: |
|||
Monday |
|||
Tuesday |
|||
Wednesday |
|||
Thursday |
|||
Friday |
|||
Saturday |
|||
Sunday |
|||
The first, fourth, and fifth elements: |
|||
For i=0: Monday |
|||
For i=3: Thursday |
|||
For i=4: Friday |
|||
The last, fourth to last, and fifth to last elements: |
|||
For i=0: Sunday |
|||
For i=3: Thursday |
|||
For i=4: Wednesday |
|||
For singly-linked lists: |
|||
All the elements: |
|||
Monday |
|||
Tuesday |
|||
Wednesday |
|||
Thursday |
|||
Friday |
|||
Saturday |
|||
Sunday |
|||
The first, fourth, and fifth elements: |
|||
For i=0: Monday |
|||
For i=3: Thursday |
|||
For i=4: Friday |
|||
The last, fourth to last, and fifth to last elements: |
|||
For i=0: Sunday |
|||
For i=3: Thursday |
|||
For i=4: Wednesday |
|||
For colors: |
|||
For arrays: |
|||
All the elements: |
|||
red |
|||
orange |
|||
yellow |
|||
green |
|||
blue |
|||
indigo |
|||
violet |
|||
The first, fourth, and fifth elements: |
|||
For i=0: red |
|||
For i=3: green |
|||
For i=4: blue |
|||
The last, fourth to last, and fifth to last elements: |
|||
For i=0: violet |
|||
For i=3: green |
|||
For i=4: yellow |
|||
For singly-linked lists: |
|||
All the elements: |
|||
red |
|||
orange |
|||
yellow |
|||
green |
|||
blue |
|||
indigo |
|||
violet |
|||
The first, fourth, and fifth elements: |
|||
For i=0: red |
|||
For i=3: green |
|||
For i=4: blue |
|||
The last, fourth to last, and fifth to last elements: |
|||
For i=0: violet |
|||
For i=3: green |
|||
For i=4: yellow |
|||
</pre> |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |