Range Over Iterators in Prolog
Based on the language specified in the prolog and the provided code example, here is the translated content:
Python Code Example
Starting with version 1.23, Go has added support for iterators, which lets us range over pretty much anything!
Let’s look at the List type from the previous example again. In that example, we had an AllElements method that returned a slice of all elements in the list. With Go iterators, we can do it better - as shown below.
class Element:
def __init__(self, val, next=None):
self.val = val
self.next = next
class List:
def __init__(self):
self.head = None
self.tail = None
def push(self, v):
new_element = Element(v)
if not self.tail:
self.head = new_element
self.tail = new_element
else:
self.tail.next = new_element
self.tail = new_element
def all(self):
def iterator():
current = self.head
while current:
yield current.val
current = current.next
return iterator
# Example use
lst = List()
lst.push(10)
lst.push(13)
lst.push(23)
for e in lst.all()():
print(e)All returns an iterator function in Python. Iteration doesn’t require an underlying data structure, and doesn’t even have to be finite! Here’s a function returning an iterator over Fibonacci numbers: it keeps running as long as yield keeps returning values.
def gen_fib():
a, b = 1, 1
while True:
yield a
a, b = b, a + b
# Example use
fib_iterator = gen_fib()
for n in fib_iterator:
if n >= 10:
break
print(n)Since List.all returns an iterator, we can use it in a regular for loop.
Packages like itertools have a number of useful functions to work with iterators. For example, list takes any iterator and collects all its values into a list.
all_elements = list(lst.all()())
print("all:", all_elements)Once the loop hits break or an early return, the iterator will stop yielding values.
Now that we can run and build basic Python programs, let’s learn more about the language.
for n in gen_fib():
if n >= 10:
break
print(n)Expected Output
10
13
23
all: [10, 13, 23]
1
1
2
3
5
8