Data is Code. Code is Data.

In LISP programming what does it mean when they say : Data is Function. Function is Data?

In Lisp, the phrase “Data is function. Function is data.” refers to a fundamental concept of Lisp programming called “homoiconicity.” Homoiconicity means that the program structure is similar to its syntax, and a program’s source code is written in a data structure that the programming language natively supports.

Here’s what “Data is function. Function is data” means in the context of Lisp:

  1. Data is function: Lisp allows you to create and manipulate functions as though they were any other kind of data. This means you can construct and modify executable code dynamically, at runtime, because that code is represented as ordinary Lisp data structures. This ability to treat functions as data allows for powerful programming techniques like metaprogramming.

  2. Function is data: Conversely, functions in Lisp are represented as data structures. The Lisp code that makes up a function is written in the form of lists, which is one of Lisp’s basic data types. This means you can use functions to generate or manipulate other functions, or even analyze and modify their own code.

This is a unique aspect of Lisp and certain other languages, but it may be difficult to grasp if you’re primarily used to programming languages that don’t exhibit homoiconicity. For those languages, the idea that code and data are interchangeable may seem strange. However, it’s this characteristic that gives Lisp its flexibility and power, and makes it well-suited for applications like artificial intelligence and symbolic processing.

Lisp vs JavaScript

JavaScript is not homoiconic like Lisp, so it doesn’t exactly have equivalent features. However, it does support first-class functions, which means that functions in JavaScript are values and can be used in ways similar to other types of data. Here are some examples that demonstrate features somewhat similar to “Data is function. Function is data” in JavaScript:

  1. Data is function (Functions as data):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// We can assign functions to variables
var greet = function() {
    console.log("Hello, world!");
};

// And pass functions as arguments to other functions
function callFunction(func) {
    func();
}

callFunction(greet);  // Output: Hello, world!
  1. Function is data (Generating functions from functions):
1
2
3
4
5
6
7
8
9
// Functions can return other functions
function createAdder(x) {
    return function(y) {
        return x + y;
    };
}

var add5 = createAdder(5);
console.log(add5(3));  // Output: 8

While these examples demonstrate some aspects of treating functions as data, they don’t fully capture the concept of “Data is function. Function is data” in Lisp. Lisp’s homoiconicity means that all code is represented as data structures, which isn’t the case in JavaScript. Nonetheless, JavaScript’s support for first-class functions does provide a degree of flexibility and expressive power.