Picolisp

El Vikipedio, la libera enciklopedio

PicoLisp estas libera dialekto de Lisp. Ĝi ruleblas sur GNU/Linukso kaj aliaj Poziksaj operaciumoj.

Povoj[redakti | redakti fonton]

Ĝia fundamenta principo estas "simpleco". Ĝi limigas sin al unu sola interna datumtipo (ĉelo), sen rezigni pri fleksebleco kaj esprimpovo. Je lingva nivelo, ĝi apogas nur tri datumtipojn (numeraloj, simboloj, kaj listoj), konstruitajn el internaj ĉeloj.

Ĉar la unusola disigebla datumtipo estas la ligillisto, ekzistas multaj interuzeblaj funkcioj por trakti listojn. Pro tio, PicoLisp-aj programoj ofte pli koncizas - kaj samtempe pli rapidas - ol tiuj de aliaj interpretataj lingvoj (vidu "Ekzemploj" sube). Funkcioj liberas de la limigoj trudataj de tradukilo, kaj do povas akcepti arbitrajn tipojn kaj nombrojn de argumentoj. Makrooj necesas nur maloftege.

Speciala povo estas prafunkcioj datumbazaj. Persistaj simboloj estas praobjektoj; aŭtomate enŝargataj el datumbazo dum atingo, kaj reskribataj dum modifo. Aplika programo konsistas el klasa hierarkio de entoj kaj rilatoj.

Plue: Prologa motoro kaj datumbazaj informmendoj, disaj datumbazoj, malfermitaj C-lingvaj funkcioj kaj indiĝenaj C-funkcioj, regado de idaj procezoj, interproceza komunikado, grafika interfaco por krozilo, internaciigo.

Historio[redakti | redakti fonton]

Originale projektita sur Apple Macintosh dum la 1980-aj jaroj, kaj uzata por komercaj aplikaĵoj ekde tiam. Oni baldaŭ adaptis ĝin al DOS kaj SCO UNIX, kaj uzis ĝin ĉefe sur Linukso ekde 1993. Oni aldonis datumbazan kapablon meze de la 1990-aj jaroj.

Kvankam la unuaj versioj estis miksaĵo de C kaj maŝinkodo, en 1999 oni reverkis ĝin tute en C. Oni eldonis tiun version en 2002 sub la licenso GNU GPL. Licenso estas ĉanĝita al MIT/X11 en 2010.

En 2009 eldoniĝis 64-bita versio. Pro diversaj limigoj de C-lingvo, la aŭtoro anstataŭe verkis la interpretilon en simpla "ĝenerala maŝinkodo", kaj verkis PicoLisp-an programon por traduki ĜM-on al la specifa maŝinkodo de x86-64.

Java versio eldoniĝis in Decembro de 2010. [1]

Ekzemploj[redakti | redakti fonton]

La jena programo plenumas la teston "Fannkuch" priskribata ĉe la retpaĝo de Alioth[rompita ligilo]:

#!/usr/bin/picolisp lib.l

(let (N (format (opt))  Lst (range N 1)  L Lst  M)
   (recur (L)  # Permute
      (if (cdr L)
         (do (length L)
            (recurse (cdr L))
            (rot L) )
         (let I 0  # For each permutation
            (and (ge0 (dec (100000000))) (prinl (reverse Lst)))
            (for (P (copy Lst)  (> (car P) 1)  (flip P (car P)))
               (inc 'I) )
            (setq M (max I M)) ) ) )
   (prinl "Pfannkuchen(" N ") = " M)
   (bye) )

Tiu ĉi montras kiel esprimpova kaj konciza povas esti PicoLisp-a programo, kompare kun la ceteraj kontribuaĵoj ĉe Alioth.

Kontraste al la supra memstara programeto, jen la aspekto de difinita funkcio:

(de fannkuch (N)
   (let (Lst (range 1 N)  L Lst  Max)
      (recur (L)  # Permute
         (if (cdr L)
            (do (length L)
               (recurse (cdr L))
               (rot L) )
            (zero N)  # For each permutation
            (for (P (copy Lst)  (> (car P) 1)  (flip P (car P)))
               (inc 'N) )
            (setq Max (max N Max)) ) )
      Max ) )

Kompreneble, rultempo estas pli longa ol tiuj de plejmultaj tradukataj lingvoj. Ni mezuris 18 minutojn sur 1.0 GHz Athlon; estu malpli sur la Intel Q660 de Alioth. Pro ties kvar-koreco, eblas kvaronigi la rultempon per paraleligi la programon:

(de fannkuch (N)
   (let (Res (need N)  Lst (range 1 N)  L Lst  Max)
      (for (R Res R (cdr R))
         (later R
            (let L (cdr Lst)
               (recur (L)  # Permute
                  (if (cdr L)
                     (do (length L)
                        (recurse (cdr L))
                        (rot L) )
                     (zero N)  # For each permutation
                     (for (P (copy Lst)  (> (car P) 1)  (flip P (car P)))
                        (inc 'N) )
                     (setq Max (max N Max)) ) )
               Max ) )
         (rot Lst) )
      (wait NIL (full Res))
      (apply max Res) ) )

Eksteraj ligiloj[redakti | redakti fonton]

Referencoj[redakti | redakti fonton]