rolisz's site

Processing IM logs

For a few years now, I've always kept my IM archives. I didn't really have a purpose, I just thought that it might be fun to one day look back and see what kind of dis­cus­sions I had. Well, now I have 150 Mb of logs from Digsby, Trillian and Pidgin and there is no way I'm ever going to read that again. But in light of a few things I learned recently (the Coursera NLP and ML courses) I am going to try to visualize and analyze my archives in a math­e­mat­i­cal way. That's right, I'm reducing you to numbers. :D. At least what we've discussed continue.

Simplu calculator în Python - partea 3

Acest post face parte dintr-o serie în care eu fac un mic calculator în Python.

Data trecută am construit arborele sintactic core­spun­ză­tor expresiei, iar acuma îl vom evalua. Aceasta este mult mai simplu decât parsarea, așa că hai să scăpăm. În final vom face apoi un REPL (read, evaluate, print loop), deci vom face o „consola” pentru cal­cu­la­torul nostru. Aceasta este utilă pentru a putea beneficia de atribuirea de valori, că altfel ele se pierd după fiecare execuție.

Să începem cu testele:

from interpreter import interpreter
from tokenizer import Tokenizer
from tree import parseTree

pT = parseTree()
tok = Tokenizer()
interp = interpreter()
Tree = pT.buildParseTree(tok.tokenize("1+2"))
assert(interp.evaluate(Tree) == 3)
Tree = pT.buildParseTree(tok.tokenize("(5+(2\*3+2))-3\*((5+6)/2-4)"))
assert(interp.evaluate(Tree) == 8.5)
Tree = pT.buildParseTree(tok.tokenize("x = 2"))
assert(interp.evaluate(Tree) 
continue.

Simplu calculator în Python - partea 2

Acest post face parte dintr-o serie în care eu fac un mic calculator în Python Data trecută ne-am ocupat de împărțirea stringului rezultat în bucăți elementare. Acum vom trece la următoarea parte: parsarea. Aceasta ne va da structura expresiei pe care vrem să o evaluăm. Dacă în urma to­k­enizării obțineam erori dacă stringul conținea caractere invalide, acum vom obține erori dacă tokenele noastre nu sunt în ordinea potrivită (dacă avem doi operatori unul după altul de exemplu) sau dacă nu sunt suficienți operanzi (numărul de paranteze deschise nu coincide cu cele închise). Este important de menționat că deocamdată nu atribuim semantică tokenelor, ci doar sintaxă. Regulile de ordine de efectuare a op­er­ați­ilor continue.

Simplu calculator în Python - partea 1

De mai multă vreme tot mă bate gândul să fac ceva in­ter­pre­ta­tor pentru un limbaj mai simplu. Ca o primă aventurare în lumea in­ter­pretării șirurilor de caractere ca in­strucți­u­ni pentru calculator, m-am decis să fac un simplu „cal­cu­la­tor” în Python, care să aibă și suport pentru câteva funcții matematice și pentru variabile.

Basically, ce urmăresc eu e să am un mic progrămel care știe să facă ur­mă­toarele:

7+10*sin(pi/2)/2-3^2  # să dea 3
x = 127-30*ln(e)      # x să aibă valoarea 97
y = x^2 - 60/30*(6+x) # y să aibă 9203

Definiția riguroasă a sintaxei pe care o acceptă programul este următoarea:

<Number> = [0-9]+.?[0-9]* <Identifier> 
continue.

Redirecting Python output from the command line

Today I needed to write a quick script that does some operations on colors. Because I'm trying to learn Vim and I'm trying to master the command line (not the standard Windows one, but Console2 + PyCmd), of course I wrote it with command-line usage in mind. The script starts taking shape, so let's use it. Well, it prints out the desired output. What next? Let's redirect its output to the clipboard. A quick Google search revealed the clip utility, which copies to the clipboard its stdin.

colors.py middle #000 #FFF | clip

Some­thing's wrong - pasting won't work. The output shows up ok in the console, but it won't redirect continue.

Metode speciale în Python

Îmi cer scuze că nu am scris de vreo 2 săpt. Am fost plecat și am fost în pană de idei

Clasele din Python pot avea, pe lângă metodele normale, care se apelează direct, și metode speciale, care nu prea sunt apelate direct (deși se poate), ci Python le apelează atunci când are nevoie de ele. Un exemplu de asemenea metodă specială, pe care toată lumea îl știe, este __init__, care definește con­struc­torul clasei. Acesta nu îl apelăm noi direct, ci Python îl apelează în momentul în care creăm o clasă nouă. Un alt exemplu destul de cunoscut (cel puțin dacă sunteți studenți la UBB) este __str__, care este continue.