Notes on computers and other things

Functions as seen in Smalltalk

April 24, 2017

⚠️ Warning: this is an exploration of a language and not something suitable for the production code.

We start by defining our own indexOf function. It takes a string, a character, and a starting index:

function indexOf(s, char, startingAt) {
  // ...

Then the function call would like like

indexOf("The owls are not what they seem.", "o", 5); // 14

It might be hard to understand what every parameter means just by looking at the call.

In JavaScript this problem is usually solved by passing an object:

function indexOf({ s, char, startingAt }) {
  // ...

  s: "The owls are not what they seem.",
  char: "o",
  startingAt: 5,
}); // 14

Let’s explore an alternative approach.

In English language you can say:

Give me the index of the character "o" in the string "The owls are not what they seem." starting at index 5.

Languages like Smalltalk and Objective-C give you an ability to encode this type of sentences in method signatures.

Here is an example Objective-C method signature:

- (int)changeColorToRed:(float)red green:(float)green blue:(float)blue;

Method call would like like this:

[myColor changeColorToRed:5.0 green:2.0 blue:6.0];

Okay, back to JavaScript.

Let’s imagine we have define function:

define("indexOf<char>in<string>startingAt<index>", (char, string, index) => {
  // reuse native JS implementation
  return string.indexOf(char, index);

The result of this is the ability to run the following expression:

indexOf({ char: "o" })
  .in({ string: "The owls are not what they seem." })
  .startingAt({ index: 5 }); // 14

Reads like a proper english sentence, right?

I will hide the definition in case you want to try code it yourself.

function define(parameterDefinitionString, handler) {
  // ...