New PGP Key

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512,SHA1

I am transitioning GPG keys from an old 1024-bit DSA key to a new
4096-bit RSA key.  The old key will continue to be valid for some time,
but I prefer all new correspondance to be encrypted in the new key, and
will be making all signatures going forward with the new key.

This transition document is signed with both keys to validate the
transition.

If you have signed my old key, I would appreciate signatures on my new
key as well, provided that your signing policy permits that without
reauthenticating me.

The old key, which I am transitioning away from, is:

  pub   dsa1024 2000-01-28 [SCA]
      7698 88C0 235A 8A75 08BB  A531 06FF 7498 22EE E656
  uid           [ultimate] Gordon Tisher 

The new key, to which I am transitioning, is:

  pub   rsa4096 2019-01-10 [SC] [expires: 2024-01-09]
      5D34 26DA 8064 4A97 31AB  73B3 ADF3 B003 07F6 ACFA
  uid           [ultimate] Gordon Tisher 


To fetch the full new key from a public key server using GnuPG, run:

  gpg --keyserver keys.gnupg.net --recv-key 5D3426DA80644A9731AB73B3ADF3B00307F6ACFA

If you have already validated my old key, you can then validate that the
new key is signed by my old key:

  gpg --check-sigs 5D3426DA80644A9731AB73B3ADF3B00307F6ACFA

If you then want to sign my new key, a simple and safe way to do that is
by using caff (shipped in Debian as part of the "signing-party" package)
as follows:

  caff 5D3426DA80644A9731AB73B3ADF3B00307F6ACFA

Please contact me via e-mail at  if you have any
questions about this document or this transition.

Gordon Tisher
gordon@balafon.net
2019-01-10
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEnIwMGjpKKcoH8GnH+r504Win618FAlw35fMACgkQ+r504Win
6197/Q//cGojOaHzEL1kFyS3BeW4jKp+Zjvk1cAQe4bUM56Ig71bBdL9dDfgM2iq
dQmr6FQfR37ljvaJdoS/zNFkN5znnGKux1EombwqqQR77/WvyopnTMadM3R2ZB56
1sLJWRLjcPaOqCW7D4c/44UASUAykwB66e0slsp/rdmtX0MhcmAmNIqZMSM+THc0
5n88/tRQuAIwmdwuP4u1z0qoOXGIKXOWp5UXcE1LEbnaCrVcJ9UXSNbs9Z+GW5LJ
MjZmUWrPMvjGh4KIr13xAbOxvhkvRc7yT9ZlxXE2gvglOa6OOeYK2ynPo6v4ZhoH
NtVqFjiOKRFkHJNlSS8bUde6OGkciKCJ26uaMIWJg3iyLDypkROkwxJfD/o185+B
dIawTBCpGjQJPB+2jx/g7w0ixtLqBs4pB4vG6XXc1tcyzs7Elh5XkLpTuZVBQCU9
b1G450fA0TVfMh8U4Qj8qPaePRYLaIRbK+QApgKrSZKpItnepBW+Cp9OEBUbqROp
faDaB6tFiM7Yq2h502ZYZlsw5DzOVhLgG8+AnV2sa4MINI/fNBLr8tWVNoRXCg76
qZCCPD5Xes16AT7lM/vF+HVrXgS0UXpQBvmTslpecvjjAQHtnKqIa91m5MHlGUZS
pAMm3awkKc+XulXQr+43myf52AMNq2hFL5xyOoKUcqu35Bpo3AaIXQQBEQIAHRYh
BHaYiMAjWop1CLulMQb/dJgi7uZWBQJcN+X0AAoJEAb/dJgi7uZWEAMAn1PPP0Zo
ZPbxA9HWq27beG1LvbvjAKCGmH8zMNBJ8i7Va/gvFD+v6cQ7nQ==
=W+Np
-----END PGP SIGNATURE-----

Configuration for Debugging the Pony Compiler in Visual Studio Code on Windows

For debugging the Pony compiler on Windows I use the following configuration files in the .vscode directory of my cloned ponyc git repo.

I also use the Pony Syntax Colorizer for syntax highlighting in Pony programs.

Updated: updated tasks.json for more recent VSCode versions.

c_cpp_properties.json:

{
  "configurations": [
    {
      "name": "Win32",
      "includePath": [
        "${workspaceRoot}/build/debug-llvm-3.9.1/ThirdParty/lib/LLVM-3.9.1-Debug/include",
        "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/include",
        "C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/shared",
        "C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/ucrt",
        "C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/um",
        "${workspaceRoot}/src/common",
        "${workspaceRoot}/src/libponyrt"
      ],
      "defines": [
        "PONY_VERSION=\"0.20.0\"",
        "LLVM_VERSION=\"3.9.1\"",
        "PONY_COMPILER=\"msvc\"",
        "PONY_BUILD_CONFIG=\"debug\"",
        "PONY_LLVM=391",
        "DEBUG",
        "_DEBUG",
        "_MSC_VER=1900",
        "UNICODE"
      ],
      "browse": {
        "limitSymbolsToIncludedHeaders": true,
        "databaseFilename": "C:/Users/Gordon/Dev/pony/ponyc/.vscode/browse/.browse.VC.db",
        "path": [
          "${workspaceRoot}/build/debug-llvm-3.9.1/ThirdParty/lib/LLVM-3.9.1-Debug/include",
          "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/include",
          "C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/shared",
          "C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/ucrt",
          "C:/Program Files (x86)/Windows Kits/10/Include/10.0.16299.0/um",
          "${workspaceRoot}/src"
        ]
      },
      "intelliSenseMode": "msvc-x64"
    }
  ],
  "version": 3
}

Obviously the version numbers and directory names for LLVM, Visual Studio and Windows SDK will need to be updated for your particular installation.

launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Ponyc",
      "type": "cppvsdbg",
      "request": "launch",
      "program": "${workspaceRoot}/build/debug-llvm-3.9.1/ponyc.exe",
      "args": [ ],
      "stopAtEntry": false,
      "cwd": "${workspaceRoot}",
      "environment": [
        {
          "name": "PONYPATH",
          "value": ""
        }
      ],
      "externalConsole": false
    },
    {
      "name": "Attach to Process",
      "type": "cppvsdbg",
      "request": "attach",
      "processId": "${command:pickProcess}"
    }
  ]
}

This provides two launch tasks, one for the Pony compiler, and one for attaching to a running program.

tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "distclean",
      "command": "${workspaceRoot}/make.bat",
      "args": [
        "distclean"
      ],
      "type": "shell",
      "group": "none",
      "problemMatcher": []
    },
    {
      "label": "configure",
      "command": "${workspaceRoot}/make.bat",
      "args": [
        "configure"
      ],
      "type": "shell",
      "group": "none",
      "problemMatcher": []
    },
    {
      "label": "clean",
      "command": "${workspaceRoot}/make.bat",
      "args": [
        "clean",
        "--config=debug"
      ],
      "type": "shell",
      "group": "none",
      "problemMatcher": []
    },
    {
      "label": "build",
      "command": "${workspaceRoot}/make.bat",
      "args": [
        "build",
        "--config=debug"
      ],
      "type": "shell",
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "problemMatcher": "$msCompile"
    },
    {
      "label": "test",
      "command": "${workspaceRoot}/make.bat",
      "args": [
        "build",
        "test",
        "--config=debug"
      ],
      "type": "shell",
      "group": {
        "kind": "test",
        "isDefault": true
      },
      "problemMatcher": "$msCompile"
    }
  ]
}

This will provide tasks for building and testing ponyc in debug mode.

settings.json

{
  "files.associations": {
    "*.h": "cpp",
    "*.c": "cpp"
  }
}

Windows builds must use C++ for all source files.

PEG Parser Library for Pony

I have recently released a PEG parser library for the Pony programming language: Kiuatan (“horse” or “pony” in Chinook Jargon). This is mostly a learning exercise for me. It doesn’t make use of any of Pony’s actor model functionality.

Kiuatan (“horse” or “pony” in Chinook Jargon) is a library for building and running parsers in the Pony programming language.

Kiuatan uses Parsing Expression Grammar semantics, which means:

  • Choices are ordered, i.e. the parser will always try to parse alternatives in the order they are declared.
    • Parsers do not backtrack from successful choices.
    • Sequences are greedy, i.e. the parser will not backtrack from the end of a sequence.
  • Kiuatan parsers are “packrat” parsers; they memoize intermediate results, resulting in linear-time parsing.
  • Parsers use Mederios et al’s algorithm to handle unlimited left-recursion.

IronMeta 4.3.0 released

I have released a new version (4.3.0) of IronMeta. Now you can pass arbitrary patterns as arguments to rules. Variables will be captured.

The IronMeta parser generator provides a programming language and application for generating pattern matchers on arbitrary streams of objects. It is an implementation of Alessandro Warth’s OMeta system in C#.