Ci sono argomenti istituzionali come Octave (sì siamo in ritardo ma il caldo, le ferie, …) e ci sono argomenti che forse poi –chissà– come Coconut. Poi ce ne sono anche altri ancora, come SICP, che meriterebbero più attenzione. Avendo tempo. OK, oggi Coconut, continuo da qui a copiare qui.
Coconut uses a
$ sign right after an iterator before a slice to perform iterator slicing. Coconut’s iterator slicing works much the same as Python’s sequence slicing, and looks much the same as Coconut’s partial application, but with brackets instead of parentheses. It has the same precedence as subscription.
Iterator slicing works just like sequence slicing, including support for negative indices and slices, and support for slice objects in the same way as can be done with normal slicing. Iterator slicing makes no guarantee, however, that the original iterator passed to it be preserved (to preserve the iterator, use Coconut’s
Coconut’s iterator slicing is very similar to Python’s itertools.islice, but unlike
itertools.islice, Coconut’s iterator slicing supports negative indices, and is optimized to play nicely with custom or built-in sequence types as well as Coconut’s
count objects, only computing the elements of each that are actually necessary to extract the desired slice. This behavior can also be extended to custom objects if they define their
__getitem__ method lazily and set
__coconut_is_lazy__ to True.
Nota: il manuale usa
10**100 ma mi da overflow😳
With Python can’t be done without a complicated iterator slicing function and inspection of custom objects. The necessary definitions in Python can be found in the Coconut header.
Coconut supports Unicode alternatives to many different operator symbols. The Unicode alternatives are relatively straightforward, and chosen to reflect the look and/or meaning of the original symbol.
→ (\u2192) => "->" ↦ (\u21a6) => "|>" *↦ (*\u21a6) => "|*>" ↤ (\u21a4) => "<|" ↤* (\u21a4*) => "<*|" ⋅ (\u22c5) => "*" ↑ (\u2191) => "**" ÷ (\xf7) => "/" ÷/ (\xf7/) => "//" ∘ (\u2218) => ".." − (\u2212) => "-" (only subtraction) ⁻ (\u207b) => "-" (only negation) ¬ (\xac) => "~" ≠ (\u2260) or ¬= (\xac=) => "!=" ≤ (\u2264) => "<=" ≥ (\u2265) => ">=" ∧ (\u2227) or ∩ (\u2229) => "&" ∨ (\u2228) or ∪ (\u222a) => "|" ⊻ (\u22bb) or ⊕ (\u2295) => "^" « (\xab) => "<<" » (\xbb) => ">>" … (\u2026) => "..." × (\xd7) => "@" (only matrix multiplication)
OK, ma forse –sono vecchio– perché cambiare. E poi non è comodissimo introdurre il codice dopo
C-S-u. Non sono riuscito a usare quelli con il codice esadecimale, per esempio
The syntax for data blocks is a cross between the syntax for functions and the syntax for classes. The first line looks like a function definition, but the rest of the body looks like a class, usually containing method definitions. This is because while data blocks actually end up as classes in Python, Coconut automatically creates a special, immutable constructor based on the given arguments.
Coconut data blocks create immutable classes derived from
collections.namedtuple and made immutable with
__slots__. Coconut data statement syntax looks like:
data <name>(<args>): <body>
<name> is the name of the new data type,
<args> are the arguments to its constructor as well as the names of its attributes, and
<body> contains the data type’s methods.Subclassing data types can be done easily by inheriting from them in a normal Python class, although to make the new subclass immutable, the line
__slots__ = ()
A mainstay of functional programming that Coconut improves in Python is the use of values, or immutable data types. Immutable data can be very useful because it guarantees that once you have some data it won’t change, but in Python creating custom immutable data types is difficult. Coconut makes it very easy by providing data blocks.
Returns a new tuple subclass. The new subclass is used to create tuple-like objects that have fields accessible by attribute lookup as well as being indexable and iterable. Instances of the subclass also have a helpful docstring (with type names and field names) and a helpful
__repr__() method which lists the tuple contents in a name=value format.
Any valid Python identifier may be used for a field name except for names starting with an underscore. Valid identifiers consist of letters, digits, and underscores but do not start with a digit or underscore and cannot be a keyword such as class, for, return, global, pass, or raise.
Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples.
This will fail because data objects are immutable
la versione Python
Showcases the syntax, features, and immutable nature of data types.
Nota: la riga dopo il decoratore viene scritta in modo bizzarro nella REPL, quella corretta è
def size(Node(left, right)) = size(left) + size(right) ovviamente.
la versione Python
Pausa, devo digerire il tutto; poi continuo sempre sulle keywords😀