Wednesday, April 27, 2016

When do two variables refer to the same object, and how to copy a variable

One of my greatest confusions of JavaScript (and sometimes, greatest vexation) is when two variables refer to the same object. For example, ab, but c is not the same object as d here:
var a = b = [1, 2, 3];
a.shift();                     // 1
b;                             // [2, 3]
var c = d = "Hello, World!";
c = c.slice(0, -1);            // "Hello, World"
d;                             // "Hello, World!"
Here is the rule: when assigning one variable to another, the variables refer to the same object if and only if the object is not a primitive. So, if the object is a string, boolean, or number, they do NOT refer to the same object. Otherwise, they refer to the same object.

Overcoming variable reference with clones!

So, what can be done? What if I want to copy an object? I use a trick for Arrays all the time, inline in code: array.slice() returns a new copy of array, so that you can modify it without affecting the original. For objects, this is rather intuitive: iterate over each property and put it in a new object. So here's some code for a JavaScript "clone" method:
function clone(value){
	// throw an error for undefined input
	if(typeof value === "undefined")
		throw new ReferenceError("expected argument at 0: value from {clone}");
	
	// check for primitives
	if(typeof value === "number" ||
	   typeof value === "string" ||
	   typeof value === "boolean")
	   return value;	// nothing needs to be done
	
	// check for array/sliceable objects
	if(typeof value.slice !== "undefined")
		return value.slice();
	
	// otherwise, let's iterate through the object
	var retObj = {};
	for(var prop in value){
		retObj[prop] = value[prop];
	}
	return retObj;
}
Rather succinct, I like it enough.

Wednesday, April 20, 2016

Null-coalescing operators: when and when not to use them

Alright, this is something I've seen too many times in JavaScript code—even professionally—so I am going to address it here. This mistake is an easy one to make, and I use to make this mistake all the time; it's easy, simple, tempting, and nigh impossible to debug. I present to you: the null-coalescing operator. That is, the simple double-bar ||. Now, you might be wondering, "what's so bad about it?" Well, nothing. It's just bad programmers using it incorrectly.

The || operator is used in JavaScript not only to describe a disjunction, but also to specify default parameters to a function. (It's used in place of default parameter assignment, i.e. the one in function foo(bar=5){}, setting bar to 5.) It might be used (correctly) in the following situation:
function add(x, y, z){
 z = z || 0;
 return x + y + z;
}
This function successfully does what it's supposed to: add x and y, and z if specified. This works because of the short-circuiting property of ||. This operator is roughly equivalent to the following function:
function disjunction(LHS, RHS){
 if(LHS){
  return LHS;
 } else {
  return RHS;
 }
}
In this case, when the LHS is undefined, the value of the expression is RHS. However, the obverse of the statement (i.e. when LHS is defined then the value is not RHS and is thus is LHS) does not hold. Observe:
function multiply(x, y, z){
 z = z || 1;
 return x * y * z;
}
This works for most testcases (try it yourself) except for when z === 0; the expected result is 0, but what we get is x * y. Why? Well, let's look at what the disjunction yields. z = z || 1 becomes z = 0 || 1, which becomes z = 1, the incorrect result. This is why I follow this rule: when the RHS to the disjunction is truthy, use typeof z === "undefined" ? default : z; otherwise, one can use ||.

Saturday, April 2, 2016

Atoms and Tokens

The atomic score (or a.s., as abbreviated further in this post) of a program is the number of functional tokens in the program. Sometimes, the atomic score does not take into count separators such as parentheses and semicolons, in some languages. However, it is not immediately clear as to how many of these there are in a program.

I found a neat rule-of-thumb technique for calculating the a.s. of a JavaScript program, and any other line-independent program: put the smallest amount of code you can en each line without changing the program (i.e., without causing a syntax error). Let's look at the following program:
var userInput = Number(Prompt("Give me some input!!"));
userInput += 20;
alert("Your number plus twenty: " + userInput);
userInput >>= 1;
alert(userInput);
Let's line-ify this! We'll remove what whitespace we can in the process.
var
userInput
=
Number
(
Prompt
(
"Give me some input!!"
)
)
;
userInput
+=
20
;
alert
(
"Your number plus twenty: "
+
userInput
)
;
userInput
>>=
1
;
alert
(
userInput
)
;
This is 31 lines, or roughly 31 tokens. If we remove separators (parens etc.) and remove non-significant tokens (e.g. var and the trailing semicolon), this becomes 21 tokens:
userInput
=
Number
Prompt
"Give me some input!!"
;
userInput
+=
20
;
alert
"Your number plus twenty: "
+
userInput
;
userInput
>>=
1
;
alert
userInput

Examples

Let's try a some more examples that compare JavaScript, Jolf, a procedural golfing language, and some other various languages. For each task, I will provide a table for each language/language style and its respective a.s. Each program will be golfed to the intent of minimizing the a.s. This means that they will retain whitespace for readability. Each tokenized program will be followed by its a.s.

Task 1: Add two inputs

JavaScript (full program) Tokenized
alert(Number(prompt()) + Number(prompt()));
alert
Number
prompt
+
Number
prompt
a.s. = 5
JavaScript (ES6 arrow function) Tokenized
(a, b) => a + b;
a
,
b
=>
a
+
b
a.s. = 7
Jolf Tokenized
+jJ
+
j
J
a.s. = 3
Japt Tokenized
U+V
U
+
V
a.s. = 3
J, Jelly, APL Tokenized
+
+
a.s. = 1

Task 2: Summation over array

Takes input as [a, b, c, …, z] and outputs a + b + c + … + z.
JavaScript (full program) Tokenized
alert(prompt().split(",").reduce(function(p, c){
    return p + c;
}));
alert
prompt
.
split
","
.
reduce
function
p
,
c
return
p
+
c
a.s. = 15
JavaScript (ES6 arrow function) Tokenized
x => x.reduce((p, c) => p + c);
x
=>
x
.
reduce
p
,
c
=>
p
+
c
a.s. = 11
Jolf Tokenized
ux
u
x
a.s. = 2
Japt Tokenized
UrAB{A+B
U
r
A
B
{
A
+
B
a.s. = 8
J, Jelly, APL Tokenized
+/
+
/
a.s. = 2
Jelly Tokenized
S
S
a.s. = 1

Final remarks

Jelly is wicked short, and it's absolutely fantastic. Japt is beautiful, and I probably did something horribly wrong in my summation attempt. Finally, Jolf is my child, and it will also be first place in my mind.

Also, feel free to correct me if I'm wrong.

Thursday, March 17, 2016

Thinking more functionally: composition

Recently, I've been learning how to program in J (website wikipedia online interpreter random link). It can be thought of as a “functional” programming language, being based off of arrays and their modification; in fact, everything is an array: numbers are singleton arrays, lists are arrays, tables are arrays of arrays, etc.; I'm not entirely sure about where boxes fall, but that's a different story.)

Anyhow, functional programming is my favorite form of programming, and J and I become friends instantly. I tried APL, but I didn't feel like non-ASCII with a useful language. So J it was.

How is this related, you may ask? Well, for my favorite project Jolf I am planning on adding an aspect of functionality to it. And this is the content of the post: to walk you through how to make JavaScript functions more functional. This is the first post in a planned three-part series. This post will cover the code behind function composition, as well as provide an overview of the topic at hand.


Step 1: outline

So what do I plan on adding? Well, to put it simply, I'm planning on emulating J's feature. To illustrate this, I will assume we have functions add, multiply, etc. defined. So, let this serve as a basic list:
  1. Function composition. That is, for functions f and , the composition f ○ g is basically this:
    [f ○ g](x0,…,xn) ≡ f(g(x0,…,xn))
    [square ○ add](x, y) = (x + y)2
    Put concisely, it's performing function f on the result of function g(x0,…,xn).
  2. Function reflection. This is, for my purpose, converting an n-ary function to a unary one by using a single argument for all of its arguments. For a binary function f, it is thus:
    f~(x) = f(x, x)
    add~(x) = x + x
  3. Function Argument Binding. “Simply” stated, to bind (or link) an argument to a function is to have that argument be passed to that function; the function that describes this behaviour is the binding of that argument to the original function. So, if we have f(x,y) being a binary function, and f ⌒ n symbolically represents the action of binding, then
    [f ⌒ n](x) = f(x, n)
    [multiply ⌒ 2](x) = 2x

Show us some code already!

Yeah, yeah, alrighty then. Let's tackle function composition first. As we know, [f ○ g] = f(g(x)). For this, we're going to modify Array.prototype. (Don't give me any flak for doing this, as I honestly don't care if it conflicts with other programs modifying the prototype. I will slap you with a trout if you do!)

We are going to write a function that returns another function that will take an arbitrary amount of arguments. It will then call the argument to the prototype with the arguments to the returned function, then the result of that will be called by the this function. That's very wordy, huh? Let's work on function composition without a prototype before converting it. This is simple enough, no? We can return a function that calls f with the application of g on the arguments. For this, we can use Array#apply in tandem with Array.from.

(NOTE! Array.from is a feature with spotty support! If you are worried with cross-browser compatabiliy, use Array.prototype.slice.call(window, arrayLike) instead.)
function compose(f, g){
 return function(){
  return f(g.apply(window, Array.from(arguments)));
 }
}
You can test this code out and see that this works. Now, for some abstraction to the prototype! Since we are using the this value within the function, I will be using a closure for consistant behaviour. This is what the basic function may look like:
Function.prototype.compose = function(otherFunc){
 return (function(orig){
  return function(){
   return orig(otherFunc.apply(window, Array.from(arguments)));
  }
 })(this);
}
This works by creating a closure that takes the this as a variable. Other than that, the code is pretty much the same as the original code constructed.

Ready for a bit of a challenge? Good, because I'm not asking. You have homework!

Exercise A: it would be nice to be able to call Function#compose with multiple arguments without having to link multiple .compose calls together. Implement this in the body of Function#compose, either your own or the one I have provided. Here following are some test cases for you that your function should pass. Beforehand I have defined the actual functions used.
function square(x){ return x*x; }
function halve(x){ return x/2; }
function add(x, y){ return x+y; }
function id(x){ return x; }

id.compose(square,add)(5, 6);         // (5*6)^2 = 30^2 = 900
id.compose(square,halve)(3);          // (3/2)^2 = 1.5^2 = 2.25
                                      // make sure you implement it in this order!
halve.compose(square,id,add)(10, 4);  // ((10+4)^2)/2 = (14^2)/2 = 196/2 = 98
Exercise B: Do this code in the shortest amount of bytes. You may convert the code to ES6, if it helps. It must, however, be in JavaScript ;). The shortest code by the time the next post is made wins an honourable mention. (You may post it in the comments below.)