# pogo

> A readable, DSL friendly programming language that compiles to JavaScript

Latest version **0.10.0** (published 2015-08-11) · BSD-2-Clause license · 0 weekly downloads

## Install

```sh
npm install pogo
pnpm add pogo
yarn add pogo
bun add pogo
```

Provides the command `pogo`.

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 0.10.0 |
| Published | 2015-08-11 |
| First published | 2012-09-07 |
| Weekly downloads | 0 |
| License | BSD-2-Clause |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 3 |
| Known vulnerabilities | 0 (+3 in 2 direct dependencies) |
| Install scripts | no |
| GitHub stars | 134 |
| Author | Tim Macfarlane |
| Maintainers | refractalize |
| Keywords | language, pogo |

## Links

- npm: https://www.npmjs.com/package/pogo
- Repository: https://github.com/featurist/pogoscript
- Issues: https://github.com/featurist/pogoscript/issues
- npm.io page: https://npm.io/package/pogo

## Dependencies (3)

- [uglify-js](https://npm.io/package/uglify-js.md) ~2.4.13
- [source-map](https://npm.io/package/source-map.md) ~0.1.31
- [underscore](https://npm.io/package/underscore.md) 1.4.4

## Recent versions

- 0.10.0 (latest) — 2015-08-11
- 0.9.10 — 2015-02-11
- 0.9.9 — 2015-02-10
- 0.9.8 — 2015-02-02
- 0.9.7 — 2015-01-19
- 0.9.6 — 2014-10-09
- 0.9.5 — 2014-09-10
- 0.9.4 — 2014-08-07
- 0.9.3 — 2014-08-05
- 0.9.2 — 2014-08-05
- 0.9.1 — 2014-08-05
- 0.9.0 — 2014-08-04
- 0.8.9 — 2014-07-30
- 0.8.8 — 2014-07-29
- 0.8.7 — 2014-07-11
- … 52 more at https://npm.io/package/pogo/versions

## README

# Whaa?

Pogoscript is a programming language that emphasises readability, is friendly to domain specific languages and compiles to regular Javascript.

[![travis-ci](https://secure.travis-ci.org/featurist/pogoscript.png?branch=master)](https://travis-ci.org/featurist/pogoscript)

[![NPM version](https://badge.fury.io/js/pogo.png)](http://badge.fury.io/js/pogo)

[![NPM dependencies](https://david-dm.org/featurist/pogoscript.png)](https://david-dm.org/featurist/pogoscript)

# Installation

Pogoscript requires [node.js](http://nodejs.org/) and [npm](http://npmjs.org/).

    npm install -g pogo

Or to install local to your project:

    npm install pogo

# Usage

## Interactive Prompt

    pogo

## Executing a Script

    pogo helloWorld.pogo

## Debugging a Script

All the regular `node` [debugging invocations](http://nodejs.org/api/debugger.html) work:

To invoke the node debugger:

	pogo debug helloWorld.pogo

To allow remote debugging, e.g. with [node-inspector](https://github.com/dannycoates/node-inspector):

	pogo --debug helloWorld.pogo

If you want to break on the first line:

	pogo --debug-brk helloWorld.pogo

You can also put breakpoints in your source code, just put `debugger` on its own line:

	someFunction ()
	debugger
	someOtherFunction ()

## Compiling a Script

    pogo -c helloWorld.pogo

Will produce `helloWorld.js`.

## Watching and Compiling

    pogo -cw helloWorld.pogo

# Examples!

The canonical [Node.js](http://nodejs.org/) hello world:

    http = require 'http'

    http.createServer @(req, res)
        res.writeHead 200 ('Content-Type': 'text/plain')
        res.end "Hello World\n"
    .listen 1337 "127.0.0.1"

    console.log 'Server running at http://127.0.0.1:1337/'

The canonical [99 beers on the wall](http://99-bottles-of-beer.net/):

    sing (n) bottlesOfBeerOnTheWall =
        if (n > 0)
            console.log ((n) bottlesOfBeerOnTheWall)
            sing (n - 1) bottlesOfBeerOnTheWall

    (n) bottlesOfBeerOnTheWall =
        "#((n) bottles) of beer on the wall, #((n) bottles) of beer.\n" +
        "Take one down, pass it around, #((n - 1) bottles) of beer on the wall."

    (n) bottles =
        if (n == 0)
            "no bottles"
        else if (n == 1)
            "1 bottle"
        else
            "#(n) bottles"

    sing 99 bottlesOfBeerOnTheWall

# The Big Features

## Arguments and Parameters

Arguments and parameters can be placed anywhere in the name of a function or method call. The careful placement of an argument or a parameter can give it a lot of meaning.

    mountains = ['Everest', 'La Tournette', 'Valuga']

    for each @(mountain) in (mountains)
        console.log (mountain)

## Blocks

Blocks are just indented code:

    after (duration, doSomething) =
        setTimeout (doSomething, duration)
    
    (n) seconds =
        n * 1000
    
    after (10 seconds)
        console.log "hi there!"

## Self

The `self` variable, also known as `this` in JavaScript, is retained from a block's outer context:

    jack = {
        name = "Jack"
        
        sayHello () =
            console.log "hi, my name is #(self.name)"
            
            after (10 seconds)
                console.log "hi! this is #(self.name) again."
    }
    
    jack.sayHello ()

But if you want and expect `self` to be redefined to something useful, put `=>` before the block like so:

    onEachHttpRequest (action, port: 3000) =
        server = http.createServer @(request, response)
            requestContext = {
                request = request
                response = response
            }
            
            action.call (requestContext)
            
        server.listen (port)
    
    onEachHttpRequest =>
        self.response.end "Hello World\n"

## Optional Arguments

Methods and functions can take optional arguments, in the form of a hash passed as the last argument.

    webServer (port: 4567) =
        console.log "starting web server on port #(port)"
    
    webServer ()
    
    webServer (port: 3000)

## No Built-in Keywords

There are no keywords in PogoScript. All control structures use the same syntax rules as regular functions and methods, so it's very easy to write your own control structures:

    unless (condition, block) =
        if (!condition)
            block ()
    
    unless (windSpeed > 25)
        console.log "going surfing"

What about a multi-line control structure?

    renderEachIn (list, render) ifNone (none) =
        if (list.length > 0)
            content = ''

            for each @(item) in (items)
                content := content + render (item)

            content
        else
            none ()

    mountains = ['Everest', 'La Tournette', 'Valuga']

    renderEach @(mountain) in (mountains)
        "<li>#(mountain)</li>"
    ifNone
        "<li>no mountains...</li>"


# More

[joshski](http://github.com/joshski) has put together a page showing [how PogoScript translates into JavaScript](http://featurist.github.com/pogo-examples). You can examine the [cheatsheet](http://pogoscript.org/cheatsheet.html), or head to the [home page](http://pogoscript.org/) page.

---
_Source: https://npm.io/package/pogo · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
