Skip to content

Instantly share code, notes, and snippets.

View sma's full-sized avatar

Stefan Matthias Aust sma

  • I.C.N.H GmbH
  • Kiel
View GitHub Profile
@sma
sma / prettyjson.py
Created January 11, 2010 12:15
pretty print JSON files
#!/usr/bin/env python2.6
"""
Convert JSON data to human-readable form.
Usage:
prettyjson [inputFile [outputFile]]
"""
import json, sys
@sma
sma / json-parser.py
Created January 13, 2010 11:57
JSON parser
import re
def parse(s):
next = iter(re.findall(ur'-?\d+|"(?:\\["\\/bfnrt]|\\u[0-9a-fA-F]{4}|[^"])*"|[{}\[\]:,]|true|false|null', s)).next
def parse_value(t):
if t[0] in "-0123456789":
return int(t)
if t[0] == '"':
return t[1:-1].decode("unicode-escape")
@sma
sma / upn.py
Created March 10, 2010 14:28
upn calculator
from operator import add, sub, mul, truediv as div
operations = {"+": add, "-": sub, "*": mul, "/": div}
stack = []
def upn(line):
for token in line.split():
if token in operations:
b, a = stack.pop(), stack.pop()

Ein Twitter-Clone mit Redis

Angenommen, wir wollen ein System modellieren, bei dem User kurze Informationsschnipsel (Posts) an einen Server schicken können, der diese an alle User verteilt, die vorher angegeben haben, besagten Users zu folgen.

Der Redis-Treiber über Python heißt redis und wird so importiert und initialisiert. In der globalen Variable r halte ich eine persistente Datenbank-Verbindung, die ich in allen weiteren Funktionen benutzen werde:

import redis
r = redis.Redis(db=1)
@sma
sma / Ingwer.java
Created July 10, 2010 10:51
Jinja2 and/or Django like template engine
package ingwer;
import org.springframework.expression.*;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Ingwer {
@sma
sma / tmpl-engine.html
Created September 11, 2010 17:25
jquery template plugin
<!DOCTYPE html>
<html>
<head>
<script src="jquery-1.4.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1>Template Engine</h1>
<div id="text"></div>
<script type="text/tmpl" name="t" charset="utf-8">
@sma
sma / gist:738236
Created December 12, 2010 18:48
Wie man einen Python-Interpreter in Java entwickeln kann

Ein Python-Interpreter

Dieser Text beschreibt theoretische Überlegungen, Python-Programme in Java zu präsentieren, um sie dann auszuführen. Auf welche Weise der Python-Quelltext übersetzt wird, ist nicht wichtig, nur das man zu jedem Python-Teilprogramm eindeutig ein Exemplar einer Java-Klasse zuordnen kann. Um den syntaktischen Ballast von Java zu reduzieren, lasse ich, wo nicht weiter wichtig, alle Sichtbarkeitsmodifikatoren und die offensichtlichen Konstruktoren zur Initialisierung der aufgeführten Exemplarvariablen weg.

Ich übersetze ein Python-Programm in zwei Arten von AST-Knoten:

abstract class Stmt {
    abstract void exec(Frame f);
}
@sma
sma / gist:760937
Created December 31, 2010 11:08
Ein Python-Interpreter in Python

Neulich habe ich gezeigt, wie ein Python-Interpreter in Java aussehen könnte, der entweder als rekursiver AST-Interpreter für einen als Java-Objekte vorliegenden abstrakten Syntaxbaum (AST) oder als virtuelle Maschine für einen aus dem abstrakten Syntaxbaum abgeleiteten Maschinencode realisiert ist.

Heute möchte ich zeigen, wie man ein Python-Programm in einen AST übersetzen kann. Dies mache ich in Python. Dann kann sich das Programm selbst in einen AST übersetzen und wenn ich aus dem AST -- ebenfalls in Python -- einen Maschinencode erzeuge, brauche ich "nur noch" einen Interpreter für die virtuelle Maschine in der Zielsprache (z.B. Java) und habe dann einen vollständigen Python-Interpreter.

So der Plan.

Zerlegen in Wörter

Der Übersetzer, der aus einem Python-Programm einen AST erzeugt, geht in zwei Schnitten vor. Zuerst soll das als String vorliegende Programm in Wörter (sogenannte Token) erlegt werden. Dann analysiere ich die Liste der Token von links nach rechts mit Hilfe eines reku

@sma
sma / maruku-generate_id-patch.rb
Created January 25, 2011 14:26
Maruku patch to generate valid IDs for non-ascii titles
# need UTF-8 mode for active support
$KCODE = "utf8"
require 'active_support/multibyte'
# monkey patch class to strip diacritics from IDs
module MaRuKu
class MDElement
def generate_id
name = children_to_s.strip
@sma
sma / factor.mdown
Created July 21, 2011 12:27
Ein langes Tutorial wie man einen Factor-Interpreter in Python schreibt

[Factor][http://factorcode.org/] ist eine Forth-artige Programmiersprache, die konkatenativ ist, d.h. man reiht Befehlswörter aneinander, die Daten auf einem Stack verarbeiten. Im Gegensatz zum klassischen sehr maschinennahen Forth unterstützt Factor (wie das Vorbild Joy) funktionale Programmierung und bietet außerdem objektorientierte Programmierung (die von CLOS, dem CommonLisp-Objektsystem, abgeschaut ist).

Das Beispiel

Factor-Programme bestehen aus Wörtern, die durch Leerzeichen getrennt sind:

3 4  + .

Dies addiert (+) die Zahlen 3 und 4 und gibt das Ergebnis mittels (.) aus. Zahlen werden nacheinander auf einen Daten-Stack geschrieben, von dem sich das + seine beiden Operanden holt und auf den es wieder das Ergebnis schreibt. Auch das . holt sich von dort ein Argument.