⚠️ 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 ) ;

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 } ) { } indexOf ( { s : "The owls are not what they seem." , char : "o" , startingAt : 5 , } ) ;

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 ) => { 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 } ) ;

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 ) { }

Show me the code!