nyuhuhuu

Posts Tagged ‘lisp’

$perl6 → ‘lispy

In Napló bejegyzések on 2008.08.26. at 14.16

Az őrültet a zsenitől. Larry Wall még sohasem hallott a Lispről és nyelvjárásairól, ezért a Perl 6-ból Lispet csinál serényen (lisper := Lisp Perl, ha-ha).

„No computer language has ever taken extensibility seriously. All languages fall into the one true syntax syndrome, and we want to escape that [...] Perl 6 has no core, no keywords, no built-in operators. Everything that looks like an operator is actually defined by some grammatical rule or by a macro or by something that is added in.”

Minderről az idei OSCON-on szólt. Wall úr gondolatai Joab Jackson Perl vision gets sharper cikkében. Említésre méltó, hogy Larry Wall gondosan a nyelvtani kiterjeszthetőséget emeli ki, amelyet ha úgy vesszük, valóban még nem produkált egyik nyelv sem. De vajon a legegyszerűbb szintaktikai formula nyújtotta tetszőleges szemantikai bővítésben rejlő lehetőség mennyivel rugalmatlanabb? Egyiknél a lexer–parser (M-expression), másiknál a reader (S-expressions) fejti ki az evaluator (meg ne nézze, mit ír erre asztaki!) számára értelmezhető objektumokat. A programozó szemszögéből a tetszőleges szintaktika bevezetése egyenértékű a legegyszerűbb nyelvtannal leírható tetszőleges jelentéstartammal. Ha lefölözzük Wall úr előadásának gondos mázát, türelmetlenül várjuk, hogy a medvét lássuk. Addig olvassák a tőlünk okosabbak okfejtéseit Lies, Damned Lies, and Perl 6 íráshoz érkezett hozzászólások során.

Unique lines in an Emacs buffer

In Napló bejegyzések on 2008.06.03. at 13.16

I needed to unique lines in a buffer’s content—the same functionality that shell command uniq provides—but could not find the proper Elisp equivalent for it, though. Even EmacsWiki suggests using the shell command to delete duplicate lines. Here goes my implementation for Lisp programs, it may come in useful.

Updated: regex quoting fixed.
Updated again: Aaron S. Hawley pointed me a much cleaner duplicate lines solution.

(defun uniq-lines (beg end)
  "Unique lines in region.
Called from a program, there are two arguments:
BEG and END (region to sort)."
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (while (not (eobp))
        (kill-line 1)
        (yank)
        (let ((next-line (point)))
          (while
              (re-search-forward
               (format "^%s" (regexp-quote (car kill-ring))) nil t)
            (replace-match "" nil nil))
          (goto-char next-line))))))

Arc: a kísérleti programozás új iskolája

In Napló bejegyzések on 2008.03.23. at 10.20

Noha már mindenki lehozta, szerkesztőségünk mégis várt addig a pillanatig, amikor igazán elemében mutathatja meg az Arcot. Scott Hanselman A Web Framework for Every Language írásában felvonultat egy tucat tálalást annak az egyszerű kívánalomnak az implementálására, hogy a felhasználó által megadott inputot (i) funkciógombra (ii) kattintást követően megjelenítsük (iii). Scott legnagyobb örömünkre egy arcos példával nyitja a repertoárt, és a megoldás puszta léte olyan szűzies örömet sugároz, amelyet feltétlenül meg akartunk osztani szemérmes Olvasóinkkal. Így hát.

(defop said req
  (aform [w/link (pr "you said: " (arg _ "foo"))
                 (pr "click here")]
         (input "foo")
         (submit)))

Hogy ne várjon, töltse az interpretert, hozzá a módot, és boldogan, amit róla mások.

GNEVE: quick video editing, that’s why we chose Emacs

In Uncategorized on 2007.10.18. at 14.55

Although the project is under heavy development (you can call it an alpha stage or proof of concept), lots of out there had just started to discuss the grounds of GNEVE, a project originally established by Martin Howse. As the project itself described, GNEVE is the GNU Emacs Video Editor mode for editing video Edit Decision Lists (EDL) based on Avidemux and Mplayer.

Late this summer my colleague Arnold joined the project. He was looking for such an environment where he could do quick [raw] video editing — no filters and fancy effects required at this point. While working the most time in Emacs it seemed obvious to search for an environment that can be controlled just the same way — with pure key shortcuts. A short research led him to Martin’s project and he got involved immediately.

As I also use Emacs for getting most of my jobs done, and after so I’m over some Lisp courses, I hooked on my colleague to extend GNEVE the way it makes video editing more convenient for us. The project is now up and running. We’ve just opened a repository at Google Code Hosting for maintaining a devel branch of GNEVE where we can release all the fixes and improvements as soon as possible. In addition, the project was submitted to Savannah by Martin — it’s not yet approved, though.

All feedbacks and supports are welcome, and I’m very glad to see that even RMS was surprised about this kind of power of Emacs. For a teaser of such kind check out the screencast Arnold has recently recorded starring GNEVE at work.

Gyorskeresés SZTAKI-ban a kurzor alatti szóra

In Napló bejegyzések on 2007.10.12. at 17.01

A funkció azóta továbbfejlődött, az emacs-sztaki legfrissebb kódbázisa elérhető a GitHubon.

A WThreeM csomag egy kevésbé ismert sajátja a w3m-retrieve-and-render függvény, amely az argumentumként kapott erőforrás szerinti weblapot az aktuális pufferben jeleníti meg. Az utolsó paramétereként átadott handler függvény segítségével aszinkron viselkedésre sarkallható, amely eredményeképpen az oldal betöltődése, majd rendelése befejeztével ez az eseménykezelő hívódik meg. A fejtörést a handler függvényfejének implementálása okozta, mígnem a w3m.el forrását tallózva rátaláltam a w3m-process-with-wait-handler-re, amely hatáskörében bevezet egy handler változót, amelyet már a w3m-retrieve-and-render is elfogad. Így megvalósítható egy olyan blokk, amelyen csak az aszinkron folyamat befejeztével lép tovább a feldolgozó. (Az aszinkron mivolthoz a folyamat háttérben futtatásához van szükség.) A továbbiakban pedig némi körítéssel bármilyen, kultúrált API-val nem rendelkező webes szolgáltatáshoz építhető burkoló. Az alábbiakban esettanulmányként álljon itt a SZTAKI angol–magyar fordítóját kiaknázó függvény, amely a kurzor alatti kifejezés fordítását keresi ki, majd küldi vissza a minipufferbe.

(defun sztaki-phrase-lookup ()
  "Look up the phrase under cursor in SZTAKI and echo translation if any."
  (interactive)
  (let* ((phrase (thing-at-point 'word))
         (url (concat "http://szotar.sztaki.hu/dict_search.php"
                      "?O=HUN&E=1&L=ENG%3AHUN%3AEngHunDict&W="
                      (w3m-url-encode-string phrase)))
         (match (format "phrase '%s' not found" phrase)))
    (with-temp-buffer
      (w3m-process-with-wait-handler
        (w3m-retrieve-and-render url nil nil nil nil handler))
      (when (re-search-forward (concat phrase ":.*") nil t)
        (setq match (match-string 0))))
    (message (concat "SZTAKI: " match))))

Az ötletet Xah Lee Emacs Lisp Grab Bag! feladatai között talált word-definition-lookup függvénye adta.

Rugalmas lista szerkesztés Lispben

In Uncategorized on 2007.10.01. at 15.17

Sean tanulmányán értettem meg a dotted pair fogalmát, habár utólag visszaolvasva az Emacs kézikönyv idevágó fejezete is világosan fogalmaz. A cons cell kifejezés a Lisp belső listaábrázolásában nyer értelmet, amely a lista egy elemét jelöli: car-ból és cdr-ből áll. A car a hordozott adatra, a cdr pedig a lista következő elemére vagy nilre mutat – violá egyszeresen láncolt lista. Funkcionális szinten tehát a car a lista első, cdr pedig a maradék elemét jelöli; lévén nem más, mint egy pointer arra a listára, aminek első eleme a következő node. Common Lispben egyébként ezeket a beszédesebb first és rest függvény szolgálja.

A cons művelet tehát gyakorlati viselkedésétől eltekintve valójában az argumentumként kapott car és cdr párost adja vissza cons cellként. Tehát a (cons 'a nil) olyan listát formál, amely első eleme az a atomot hordozza, és láthatóan cdre-je nil, tehát következő elem nincs. A dotted pair akkor lép színre, amikor a cons cell cdr-je nem listára mutat, hanem szintén egy atomra. Lispben ez olyan annyira bevált módszer lett, hogy az eddigi (cons 'a 'b) konstrukció helyett bevezették a tisztább (a . b) jelölést. Ha egy cons cell utolsó eleme lehet pointer atomra, a kapcsolt pár (dotted pair) segítségével könnyen körkörösen láncolt listát képezhetünk a lineárisan láncolt listánkból.

(setf list '(a b c))
(setf (cdddr list) list)
=> (a b c a b . #2)

Beleírtam a Lispet az “A1″ mezőbe.

WL contribute: blogmark küldés emacs-w3m alól

In Uncategorized on 2007.09.25. at 09.16

Interaktív függvény, amellyel a Weblaborra küldhető be blogmarkként Emacs-w3m alól a kurzor alatti link vagy a w3m-ben aktuálisan megnyitott weblap. A C-c b billentyűzet kombinációhoz rendeltem. Customize to your needs.

(defun slink-weblabor-blogmark ()
  "Blogmark either the url under point or
   the url of the current w3m page to Weblabor."
  (interactive)
  (let ((w3m-async-exec nil))
    (when (thing-at-point-url-at-point)
      (unless (eq (current-buffer) (w3m-alive-p))
	(w3m-goto-url (thing-at-point-url-at-point))))
    (w3m-goto-url
     (concat "http://weblabor.hu/blogmarkok/bekuldes/tavoli?"
	     "url="    (w3m-url-encode-string
			(read-string "URL: " w3m-current-url))
	     "&title=" (w3m-url-encode-string
			(read-string "Title: " w3m-current-title))
	     "&comment=" (w3m-url-encode-string
			  (read-string "Comment: "))
	     "&publish=0#maincontent"))))

(eval-after-load "w3m"
  '(define-key w3m-mode-map (kbd "C-c b")
    'slink-weblabor-blogmark))

A kurzor alatti link ötlete Johntól származik.

Learning time: 306 min, 16 sec

In Uncategorized on 2007.09.06. at 22.31

Amikor először ismerkedtem a Pythonnal, emlékszem, főképpen azt szerettem benne, hogy egyből tudtam kisérletezni, a Mindentudó Python valamennyi feladványát rögvest ki tudtam próbálni, kommunikálni tudtam az interpreterrel, interaktív módon. Most ugyanezt érzem a Lisppel.

Példa deep-remove függvény a Lisp kurzusból

Anno tett fogadalmam teljesítésén nagyon lendített az a momentum, amikor feliratkoztam a Lisp Course-ra. Tény, hogy az Emacs kéznél van, ha a Lisp kifejezéseket szeretném gyakorolni, mindemellett az ELM Adaptive Remote Tutor-hoz fogható zseniális távoktató keretrendszert még nem láttam.

A kiválóan szerkesztett tananyagra épülő modulok végét eleinte teszt jellegű, majd konkrét kód formájában megválaszolandó feladványok zárják, amelyeken megfelelő szintet elérve léphetünk csak a következő fejezetre. A hibásan definiált programkódoknál precíz támpontot kapunk arra nézve, milyen kifejezésnél vétettünk hibát, milyen logikai tévedés mentén hasal el a deklarált függvény.

Az egyes leckék anyagaihoz megjegyzéseket fűzhetünk, bármikor lehetőség van a kurzus pihentetésére, feladatsorok megoldásánál igénybe vehetjük a témába vágó nyelvi elemek, függvények pontos referenciáit, végezetül csupán gyakorlásképpen bármikor rendelkezésünkre áll egy [webes] Lisp értelmező.

Ideas first introduced in Lisp include the if/then/else construct, recursive function calls, dynamic memory allocation, garbage collection, first-class functions, lexical closures, interactive programming, incremental compilation, and dynamic typing. (Peter Seibel: Practical Common Lisp)

A Lisp Course-ra jelentkezés ingyenes. Az oktatócsomag hat részre tagolódik, kezdve a Lisp primitívjeivel, nevezett atomok, s-atomok, listák, majd predikátumok, logikai és vezérlési szerkezetek, alapvető funkciók, végül különféle rekurziók sít. A beépített statisztika modul bizonysága szerint 5 órát töltöttem a rendszerben, míg a teljes tananyagot elsajátítottam. A megkérdezettek 91%-a szerint érdemes Lispet tanulni.

On-the-fly JavaScript syntax checking in Emacs

In Napló bejegyzések on 2007.08.24. at 22.08

I will take you through the following steps in order to get on-the-fly spell checking in your Emacs with flymake-js while coding JavaScript.

Flymake-js showing error message

Tovább ehhez a bejegyzéshez »

Az újévben Lispet fogok tanulni

In Uncategorized on 2007.01.10. at 13.30

Az újévi fogadalmak babonáját nem érzem magaménak, noha szakmai vonatkozásában mindenféleképpen érdemes elgondolkodnia az embernek azon, merre szeretne tovább fejlődni, az aktuális trendek, technológiai újdonságok mezején merre szeretne haladni, milyen területekkel kíván az újévben megismerkedni, amelyek elősegítik az adott szakterület iránti érdeklődés fenntartását, javítja a munka morált, továbbá a sokat hangoztatott tudás alapú társadalomban is segíti mindazon szellemi tőke felhalmozását, amely versenyelőnyhöz juttat minket a piacon. Meg egyáltalán, aki nem élvezi a munkáját, minek dolgozik benne?

Debasish Ghosh napokban publikált Why I should learn Lisp írása ösztönzött arra, hogy hosszabban elgondolkodjam az elmúlt év és az előttem álló újabb több száz nap lehetőségein. Az ahány nyelv, annyi ember tökéletesen illeszkedik (exact match, lól) a programozási nyelvek világára is, többek között ennek és Bártházi András Rails iránti lelkesedésének apropóján határoztam el, hogy magamévá teszem a Rubyt. Ebből az elhatározásból végül Java és JavaScript kódok szorgos írása lett, emellett pedig céges munkáim során a shell szkript programozásban is bőséges gyakorlatot szereztem. Az újévre terveim mindenek előtt a Ghosh által is érintett Lisp megismerése, a GWT és Pyjamas haladó alkalmazása, továbbá tudásom mélyítése valamennyi Google technológia kapcsán. És neked?

Szerkesztőségünk fennebbi terveihez kapcsolódó valamennyi könyvbeli felajánlást szívesen fogadja!

Illusztráció: Dr. Eick, Artificial Intelligence Programming

Follow

Get every new post delivered to your Inbox.