avatarThe Modern Scholastic

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

3786

Abstract

arison operators, and bitwise operators on this type too.</p><p id="c4da">It’s important to note that there is another type, called <code>bytes</code> which is different from the above in that it is a dynamically sized array, and not a value type but a reference type. It is basically shorthand for <code>byte[]</code>.</p><p id="ad39">When you can limit the length of your data to a predefined amount of bytes, it is always good practice to use some of <code>bytes1</code> to <code>bytes32</code> because it is much cheaper.</p><h2 id="0118">Enums</h2><p id="aea7"><b>Enums</b> in Solidity are a way to create user-defined types. Enums are explicitly convertible to integer types, but not implicitly. Enum values are numbered in the order they are defined, starting from 0.</p><p id="ed00">Enums are not part of the ABI (Application Binary Interface — more on this in a later lesson, but it’s basically how you encode Solidity code for the Ethereum Virtual Machine, and how you get data back). This means that if your function returns an <code>enum</code> for example, it will be automatically converted to a <code>uint8</code> behind the scenes. The integer returned is just large enough to hold all enum values. With more values, the size gets increased too (<code>uint16</code> and up).</p><p id="cdb6">The below code, taken from the <a href="https://docs.soliditylang.org/en/v0.4.24/index.html">Solidity docs</a>, defines an enum with four possible values, creates a variable of that enum named <code>choice</code> and a constant called <code>defaultChoice</code>that will hold a default value.</p><div id="cf29"><pre><span class="hljs-keyword">enum</span> <span class="hljs-title class_">ActionChoices</span> { GoLeft, GoRight, GoStraight, SitStill } ActionChoices choice; ActionChoices <span class="hljs-type">constant</span> <span class="hljs-variable">defaultChoice</span> <span class="hljs-operator">=</span> ActionChoices.GoStraight;</pre></div><p id="66a9">Now we can define some functions to interact with our <code>enum</code>.</p><div id="c0bb"><pre><span class="hljs-title function_"><span class="hljs-keyword">function</span> <span class="hljs-title">setGoStraight</span></span>() <span class="hljs-keyword">public</span> { choice = ActionChoices.GoStraight; }

<span class="hljs-title function_"><span class="hljs-keyword">function</span> <span class="hljs-title">setChoice</span></span>(ActionChoices <span class="hljs-keyword">new</span><span class="hljs-type">Choice</span>) <span class="hljs-keyword">public</span> { choice = <span class="hljs-keyword">new</span><span class="hljs-type">Choice</span>; }</pre></div><p id="6bc2">The first one simply sets the <code>choice</code> to <code>GoStraight</code> while the second one sets it to the choice that the caller passes into the function. As we can see after deployment, the <code>setChoice</code> function expects a <code>uint8</code> value, which corresponds to the <code>enum</code> value declared at that number.</p><figure id="e997"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*1pKNPVy4UUBCSLi2-SIckg.png"><figcaption>Testing enums in Remix</figcaption></figure><p id="7917">If we want to get the value of <code>choice</code> and <code>defaultChoice</code>, we can define the following functions:</p><div id="1f02"><pre><span class="hljs-keyword">function</span> <span class="hljs-title">getChoice</span>() public view returns (ActionChoices) { <span class="hljs-keyword">return</span> <span class="hljs-type">choice</span>; }</pre></div><div id="43e7"><pre><span class="hljs-function">function <span class="hljs-title">getDefaultChoice</span>() <span class="hljs-keyword">public</span> pure <span class="hljs-title">returns</span> (<span class="hljs-params"><span class=

Options

"hljs-built_in">uint</span></span>)</span> { <span class="hljs-keyword">return</span> <span class="hljs-built_in">uint</span>(defaultChoice); }</pre></div><p id="c2f2">As we can see if we try this out in Remix, the first function returns a <code>uint8</code> while the second returns a <code>uint256</code>.</p><figure id="e514"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*jmaOFb9GhXz7FWC4ONMa_A.png"><figcaption>Testing enums in Remix</figcaption></figure><h2 id="3c7c">Fixed point numbers</h2><p id="2ecc"><b>Fixed point numbers </b>represent fractional numbers by storing a fixed number of digits of their fractional part. No matter how large or small the fractional part is, it will always use the same number of bits.</p><p id="cdcd" type="7">Fixed point numbers are not fully supported by Solidity yet. They can be declared, but cannot be assigned to or from.</p><p id="f872">We can differentiate between signed fixed point numbers, declared with the <code>fixed</code> keyword, and unsigned fixed point numbers, declared with the <code>ufixed</code> keyword.</p><p id="3c1c">It can also be declared as <code>fixedMxN</code> or <code>ufixedMxN</code> where <code>M</code> represents the number of bits the type takes, and <code>N</code> represents the number of decimal points. <code>M</code> has to be divisible by 8 and a number between 8 and 256. <code>N</code> has to be a number between 0 and 80.</p><p id="96e1">They function with the following operators:</p><ul><li>Comparisons: <code><=</code>, <code><</code>, <code>==</code>, <code>!=</code>, <code>>=</code>, <code>></code> (evaluate to <code>bool</code>)</li><li>Arithmetic operators: <code>+</code>, <code>-</code>, unary <code>-</code>, unary <code>+</code>, <code>*</code>, <code>/</code>, <code>%</code> (remainder)</li></ul><h2 id="09b7">Conclusion</h2><p id="bd3a">In this lesson, we looked at what value types are available in Solidity and how each one works.</p><p id="28de">Thank you for staying with us till the end. If you enjoyed reading this piece please keep in touch and follow Solidify to keep up with our lessons on Solidity. In the upcoming articles, we will deep dive into the intricacies of the language, progressing from beginner to advanced level.</p><p id="067c">If you are new to Solidity, check out the previous lessons about setting up a local development environment and writing your first smart contract.</p><div id="6b76" class="link-block"> <a href="https://readmedium.com/how-to-setup-your-local-solidity-development-environment-c4c8195810f3"> <div> <div> <h2>How to Setup Your Local Solidity Development Environment</h2> <div><h3>Get started with smart contract development</h3></div> <div><p>medium.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/1*HHko-o9m1sVngmTeRVYgKA.jpeg)"></div> </div> </div> </a> </div><div id="3ad1" class="link-block"> <a href="https://readmedium.com/lesson-1-your-first-solidity-smart-contract-1ba7e641f9a3"> <div> <div> <h2>Lesson 1: Your First Solidity Smart Contract</h2> <div><h3>In the previous lesson, we looked at how to set up your local Solidity development environment. Here we will continue…</h3></div> <div><p>medium.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/1*7r7HSYkbn73NrmR_skvh5w.jpeg)"></div> </div> </div> </a> </div></article></body>

Python and Plato (1) — Using Python to Introduce the Great Philosopher

Who was Plato?

‘A picture speaks a thousand words’.

Centre of The Academy

This is a painting I’m sure everyone would recognise.

It is known as ‘The School of Athens’ by Raphael, the renaissance artist.

At the centre of the picture are Plato and Aristotle.

  • Plato points upwards — did you notice?
  • Aristotle gestures towards the ground.

That captures the essence of the two giants of philosophy.

  • Plato looks upwards to the eternal realms we cannot reach.
  • Aristotle seeks truth, first and foremost, in the created order.

Python?

I promised that this would be related to Python somehow.

Photo by Rubaitul Azad on Unsplash

I’ll try my best.

Forms

Plato believed that there was something known as ‘Forms’.

They are entities that reside in a perfect realm, beyond our immediate senses.

As human beings, he would say, we can perceive what is good.

  • The “goodness” of a gulp of fresh water on a hot day.
  • The “goodness” of seeing the combination of colours on your code editor.

But there are different, perhaps nobler, kinds of goodness:

  • The goodness of a warm hug from a friend in times of trouble.
  • The goodness of an embrace from a loved one or a partner.

Because we are able to hold a diversity of goodness in our minds, Plato concludes:

Since these things are so, we must agree that that which keeps its own form unchangingly, which has not been brought into being and is not destroyed, which neither receives into itself anything else from anywhere else, nor itself enters into anything anywhere, is one thing.

- from Timaeus

Essentially:

The most fundamental, exalted, eternal, unchanging — Goodness - must exist.

- Me

It must also exceed what we can immediately perceive and understand.

Python Iterators

One analogue I can think of in Python is the Iterator class.

Photo by Tim Johnson on Unsplash

According to the docs:

The iterator objects themselves are required to support the following two methods, which together form the iterator protocol:

iterator.__iter__()

Return the iterator object itself. This is required to allow both containers and iterators to be used with the for and in statements. This method corresponds to the tp_iter slot of the type structure for Python objects in the Python/C API.

iterator.__next__()

Return the next item from the iterator. If there are no further items, raise the StopIteration exception. This method corresponds to the tp_iternext slot of the type structure for Python objects in the Python/C API.

So let’s say we try to implement a class which has these two methods, “Sentence”:

import re
import reprlib

RE_WORD = re.compile(r'\w+')

class Sentence:
def __init__(self, text):
   self.text = text
   self.words = RE_WORD.findall(text)
def __repr__(self):
   return f'Sentence({reprlib.repr(self.text)})'
def __iter__(self): 
   return SentenceIterator(self.words)

where SentenceIterator has the __next__ dunder method:

class SentenceIterator:

  def __init__(self, words):
     self.words = words 
     self.index = 0

  def __next__(self):
     try:
       word = self.words[self.index] 
     except IndexError:
       raise StopIteration() 
     self.index += 1 
     return word

  def __iter__(self): 
     return self

Taken from Ramalho, Luciano. Fluent Python (pp. 607–608). O’Reilly Media.

Let’s verify that an instance of Sentence is an Iterable.

s = Sentence('It is time to learn Philosophy from Plato, Pythonistas.')

# try it out - to get a feel for what is iterated over
for word in s:
   print(word)

from collections import abc
print(isinstance(s, abc.Iterable)) # returns True 

isinstance(s, abc.Iterable) returns True.

Diversity of Iterables

So there are many things in the world that can be represented by iterables.

Sentences, thoughts, random-number-generators, days of a year, a puppet that can only say ‘hallo’ when you press its button somewhere.

But all these things come down to having the __iter__ and __next__ dunder methods. (In the goose typing approach.)

Inheritance Not Needed

For Plato, things of beauty don’t have to be biologically related to each other.

A beautiful dog can of course give birth to beautiful dogs.

But a thing can be beautiful without having to be a descendent of some other beautiful thing.

Similarly, Python doesn’t require a class to inherit abc.Iterable in order for a class to be an iterable.

The whole idea of Plato’s Philosophy is to understand what the essence of fundamental forms is.

It’s easy for us, because we’ve simply defined what an Iterable is.

But the task of the Philosopher is not as easy.

Exeunt

I don’t know if they clapped in Plato’s school, The Academy, shown at the top of the article.

But if this somehow inspired you, feel free to imagine yourself to be in the hallway of the Academy and make a resounding noise.

Programming
Software Development
Software Engineering
Philosophy
Python
Recommended from ReadMedium