Vale la pena que lo lean no el ataque personalizado que hace al monigote de Microsoft sino el porque la supuesta apertura de protocolos de Microsoft no significa más
que una jugada publicitaria con poca incidencia en la industria. Gallí lo explica bien, pero para mi las personas son circunstanciales, acá lo que hay que discutir son las ideas.
2/24/2008
Las ideas, las patentes, las personas y bla!
Publicado por
santi
en
6:23 PM
2
comentarios
Desde emacs II
Hace poco comenté como postear desde GNU/Emacs con g-client, pero últimamente estoy bastante desde GNUS así que acá va una función para invocar rápidamente un nuevo correo a la dirección secreta de Blogger, con el header Content-type en html.
(defun entrada-codigomaldito () "Inserta una entrada en código maldito" (interactive) (compose-mail "codigomaldito" "Sujeto" '(("Content-Type" . "text/html;")) nil ) (message-sort-headers) )
Chau!
Publicado por
santi
en
7:25 AM
0
comentarios
2/21/2008
Las raíces de Lisp
Traducción
El siguiente documento es una traducción bastante libre del documento publicado por Paul Graham en su sitio web [The Roots Of Lisp], es un ensayo sobre los fundamentos del lenguaje de programación Lisp.
(Traducción por Emilio Astarita, lamento todos los errores que pudiesen encontrar, la siguiente función en emacs lisp devuelve mi correo electrónico dónde pueden reportarlos.)
(defun no-spam()
"Correo para reportar errores."
(let ((f "emilio")
(l "astarita"))
(concat "<" f "." l "@gmail.com" ">")))
Autor: Paul Graham, borrador Enero 18, 2002
En 1960, John McCarthy publicó un notable paper en el cuál, hizo por la programación algo parecido a lo que Euclides hizo por la geometría [1]. Mostró de que manera con un puñado de operadores simples y una notación para funciones, se puede construir un lenguaje de programación. Llamó a este lenguaje Lisp, por "List Processing", debido a que una de sus principales ideas era usar una estructura de datos simple llamada list, para el código y los datos.
Vale la pena comprender lo que McCarthy descubrió, no sólo como un hito en la historia de las computadores, sino como un modelo de lo que la programación está tendiendo a convertirse en nuestro propio tiempo. Parece que se han producido dos claros modelos consistentes de programación hasta la fecha: el modelo de C y el modelo de Lisp. Una receta popular para los nuevos lenguajes de programación en los pasados 20 años fue tomar el modelo de C y agregarle, pequeñas partes tomadas del modelo de Lisp, tales como tipado en tiempo de ejecución y recolección de basura.
En este artículo se intentará explicar en los términos más simples posibles lo que McCarthy descubrió. El punto no es sólo aprender acerca de un interesante resultado teórico que alguien averiguó hace cuarenta años, sino mostrar de dónde los lenguajes partieron. La característica inusual de Lisp -en realidad, la definición de la calidad de Lisp- es que puede escribirse a si mismo. Para entender lo que McCarthy quiere decir con esto, vamos a recorrer sus pasos, con su notación matemática traducida en código Common Lisp ejecutable.
1. Siete operadores primitivos
Para empezar, se define una expresión. Una
expresión es a la vez un átomo, el cual es una
secuencia de letras (e.g. foo), o
una lista de cero o más expresiones, separadas por
espacios en blanco y encerradas por paréntesis. Algunas
expresiones:
foo
()
(foo)
(foo bar)
(a b (c) d)
La última expresión es una lista de cuatro elementos, el tercero de ellos es a su vez una lista de un elemento.
En aritmética la expresión 1 + 1 tiene el valor 2. Las
expresiones válidas en Lisp también tienen valores. Si de una
expresión e se obtiene el valor v, se
dice que e devuelve v. El
próximo paso es definir que tipo de expresiones puden existir, y
que valor devuelve cada tipo.
Si una expresión es una lista, se llama al primer elemento
el operador y a los elementos restantes
los argumentos. Se van a definir siete operadores
primitivos (en el sentido de
axiomas): quote, atom, eq, car,
cdr, cons, y
cond.
1. (quote x)
(quote x) devuelve x. Por legibilidad
abreviamos (quote x) como 'x.
> (quote a)
a
> 'a
a
> (quote (a b c))
(a b c)
Nota traducción: la mayoría de las veces traduciremos quoted, como escapar
2. (atom x)
(atom x) devuelve el átomo t si el
valor de x es un átomo o la lista vacía. En Lisp
se acostumbra a usar el átomo t para representar
verdadero, y la lista vacia para representar falso.
> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t
Ahora que se tiene un operador cuyo argumento es evaluado se
puede mostrar para que sirve quote. Escapando una
lista con quote evitamos su evaluación. Una lista
no escapada dada como argumento a un operador
como atom es tratada como código:
> (atom (atom 'a))
t
en cualquier lugar en dónde aparezca una lista escapada se trata como una mera lista, en este caso una lista de dos elementos:
> (atom '(atom 'a))
()
Esto es similar a la manera en que se usan las comillas en inglés. Cambridge es una ciudad en Massachusetts que tiene cerca de 90.000 personas. "Cambridge" es una palabra que contiene nueve letras.
Escapar puede parecer un concepto algo lejano, porque muy
pocos lenguajes tienen algo como esto. Está muy
relacionado a una de las más distintivas características de
Lisp: código y datos están hechos de las mismas estructuras de
datos, y el operador quote es la manera en que se
distingue entre ellos.
3. (eq x y)
(eq x y) devuelve t si los valores de
x e y son el mismo átomo, o los dos la
lista vacía, y () en cualquier otro caso.
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t
4. (car x)
(car x) espera que el valor de x sea
una lista, y devuelve su primer elemento.
> (car '(a b c))
a
5. (cdr x)
(cdr x) espera que el valor de x sea
una lista, y devuelve todo lo posterior al primer elemento.
> (cdr '(a b c))
(b c)
6. (cons x y)
(cons x y) espera que el valor de y sea
una lista, y devuelve el valor de x seguido por los
elementos del valor de y.
> (cons 'a '(b c))
(a b c)
> (cons 'a (cons 'b (cons 'c '())))
(a b c)
> (car (cons 'a '(b c)))
a
> (cdr (cons 'a '(b c)))
(b c)
7. (cond (p1 e1)...(pn en))
(cond (p1 e1)...(pn
en)) es evaluado de la siguiente manera. La
expresiones p son evaluadas en orden hasta que una
devuelva t. Cuando una es encontrada, el
valor de la expresión e correspondiente es devuelto
como el valor de toda la expresión cond.
> (cond ((eq 'a 'b) 'first)
((atom 'a) 'second))
second
En cinco de los siete operadores primitivos, los argumentos son
siempre evaluados cuando una expresión que comienza con ese
operador es evaluada.[2] Se llama a un operador de ese tipo
una función.
2. Denotar funciones
A continuación se define una notación para describir
funciones. Una función se expresa como (lambda
(p1...pn) e),
dónde p1...pn son átomos
(llamados parámetros) y e es una
expresión. Una expresión cuyo primer elemento es una
expresión
((lambda (p1...pn) e) a1...an)
es conocida como una llamada de función y su valor
es cálculado de la siguiente manera. Cada
expresión ai es
evaluada. Luego e es evaluada. Durante la
evaluación de e, el valor de cualquier ocurrencia
de uno de los pi , es el valor del
correspondiente ai en la llamada de
función más reciente.
> ((lambda (x) (cons x '(b))) 'a)
(a b)
> ((lambda (x y) (cons x (cdr y)))
'z
'(a b c))
(z b c)
Si una expresión tiene como primer elemento un
átomo f que no es uno de los operadores primitivos
(f a1...an)
y el valor de f es una función (lambda
(p1...pn) e) luego el valor de la
expresión es el valor de
((lambda (p1...pn) e) a1...an)
En otras palabras, los parámetros pueden ser usados tanto como operadores o como argumentos en expresiones:
> ((lambda (f) (f '(b c)))
'(lambda (x) (cons 'a x)))
(a b c)
Hay otra notación para funciones que permite a la función referirse a sí misma, así se brinda una manera conveniente de definir funciones recursivas.[3] La notación
(label f (lambda (p1...pn e))
denota una función que se comporta como (lambda
(p1...pn) e), con la propiedad
adicional de que una ocurrencia de f
en e evalua a la expresión label, como
si f fuese un parametro de la función.
Suponiendo que se quisiera definir una función (subst x y
z), la cual toma una expresión x, un
átomo y, y una lista z, y devuelve una
lista como z pero con cada instancia
de y (a cualquier profundidad de anidamiento)
en z reemplazada por x.
> (subst 'm 'b '(a b (a b c) d))
(a m (a m c) d)
Se puede denotar esta función como
(label subst (lambda (x y z)
(cond ((atom z)
(cond ((eq z y) x)
('t z)))
('t (cons (subst x y (car z))
(subst x y (cdr z)))))))
Se abreviará f = (label f (lambda
(p1...pn) e)) como
(defun f (p1...pn) e)
así
(defun subst (x y z)
(cond ((atom z)
(cond ((eq z y) x)
('t z)))
('t (cons (subst x y (car z))
(subst x y (cdr z))))))
A proposito, aquí se ve como conseguir una cláusula por omisión
en una expresión cond. Una cláusula cuyo primer
elemento es 't será siempre éxitosa. Así
(cond (x y) ('t z))
es equivalente a lo que tal vez se escribiría en un lenguaje con síntaxis como:
if x then y else z
3. Algunas funciones
Ahora que se tiene una manera de expresar funciones, se definen
algunas nuevas en términos de los siete operadores
primitivos. Primero es conveniente introducir algunas
abreviaciones de patrones comunes. Se usará el cxr,
dónde x es una secuencia de as
o ds, como una abreviación para la composición
correspondiente de car y cdr. Así, por
ejemplo (cadr e) es una abreviación de (car
(cdr e)), la cual devuelve el segundo elemento
de e.
> (cadr '((a b) (c d) e))
(c d)
> (caddr '((a b) (c d) e))
e
> (cdar '((a b) (c d) e))
(b)
También, se usará (list
e1...en para (cons
e1 ... (cons en '()) ... ).
> (cons 'a (cons 'b (cons 'c '())))
(a b c)
> (list 'a 'b 'c)
(a b c)
Ahora se definen algunas funciones nuevas. Se cambiaron los nombres de estas funciones agregando un punto al final. Esto distingue a las funciones primitivas de las definidas en términos de estas, y además evita colisiones con funciones existentes en Common Lisp.
1. (null. x)
(null. x) prueba si su arguemento es la lista
vacia.
(defun null. (x)
(eq x '()))
> (null. 'a)
()
> (null. '())
t
2. (and. x y)
(and. x y) devuelve t si ambos
argumentos lo hacen, y () en cualquier otro caso.
(defun and. (x y)
(cond (x (cond (y 't) ('t '())))
('t '())))
> (and. (atom 'a) (eq 'a 'a))
t
> (and. (atom 'a) (eq 'a 'b))
()
3. (not. x)
(not. x) devuelve t si su argumento
devuelve (), y () si su argumento
devuelve t.
(defun not. (x)
(cond (x '())
('t 't)))
> (not. (eq 'a 'a))
()
> (not. (eq 'a 'b))
t
4. (append. x y)
(append. x y) toma dos listas y devuelve la
concatenación de estas.
(defun append. (x y)
(cond ((null. x) y)
('t (cons (car x) (append. (cdr x) y)))))
> (append. '(a b) '(c d))
(a b c d)
> (append. '() '(c d))
(c d)
5. (pair. x y)
(pair. x y) toma dos listas de igual longitud y
devuelve una lista de listas de dos elementos conteniendo pares
sucesivos de un elemento de cada una.
(defun pair. (x y)
(cond ((and. (null. x) (null. y)) '())
((and. (not. (atom x)) (not. (atom y)))
(cons (list (car x) (car y))
(pair. (cdr x) (cdr y))))))
> (pair. '(x y z) '(a b c))
((x a) (y b) (z c))
6. (assoc. x y)
(assoc. x y) toma un átomo x y una
lista y de la forma creada por pair.,
y devuelve el segundo elemento de la primera lista
en y cuyo primer elemento es x.
(defun assoc. (x y)
(cond ((eq (caar y) x) (cadar y))
('t (assoc. x (cdr y)))))
> (assoc. 'x '((x a) (y b)))
a
> (assoc. 'x '((x new) (x a) (y b)))
new
4. La sorpresa
Así, se pudo definir funciones que concatenan listas, sustituyen una expresión por otra, etc. Una notación elegante, tal vez, pero. ¿Ahora qué? Ahora viene la sorpresa. Se puede también, es resultado de, escribir una función que actue como un interprete para nuestro lengauje: una función que tome como un argumento cualquier expresión Lisp, y devuelva su valor. Aquí está:
(defun eval. (e a)
(cond
((atom e) (assoc. e a))
((atom (car e))
(cond
((eq (car e) 'quote) (cadr e))
((eq (car e) 'atom) (atom (eval. (cadr e) a)))
((eq (car e) 'eq) (eq (eval. (cadr e) a)
(eval. (cadr e) a)))
((eq (car e) 'car) (car (eval. (cadr e) a)))
((eq (car e) 'cdr) (cdr (eval. (cadr e) a)))
((eq (car e) 'cons) (cons (eval. (cadr e) a)
(eval. (caddr e) a)))
((eq (car e) 'cond) (evcon. (cdr e) a))
('t (eval. (cons (assoc. (car e) a)
(cdr e))
a))))
((eq (caar e) 'label)
(eval. (cons (caddar e) (cdr e))
(cons (list (cadar e) (car e)) a)))
((eq (caar e) 'lambda)
(eval. (caddar e)
(append. (pair. (cadar e) (evlis. (cdr e) a))
a)))))
(defun evcon. (c a)
(cond ((eval. (caar c) a)
(eval. (cadar c) a))
('t (evcon. (cdr c) a))))
(defun evlis. (m a)
(cond ((null. m) '())
('t (cons (eval. (car m) a)
(evlis. (cdr m) a)))))
La definición de eval. es más larga que cualquiera
de las otras vistas anteriormente. Vamos a considerar como
trabaja cada parte.
La función toma dos argumentos: e, la expresión a
ser evaluada, y a, una lista que representa los
valores que los átomos fueron tomanado al aparecer como
parámetros en las llamadas de función. Esta lista es
llamada entorno, y es de la forma creada
por pair.. Su fin es construir y buscar en las
listas que se escribieron para It was in order to build and
search these lists that we wrote pair.
y assoc.pair.
and assoc.
La columna de eval. es una
expresión cond con cuatro cláusulas. Como se evalua
una expresión depende del tipo que sea. La primer cláusula
evalua átomos. Si e es un átomo, se busca su valor
en el entorno:
> (eval. 'x '((x a) (y b)))
a
La segunda cláusula de eval. es
otra cond para el manejo de expresiones de la
forma (a ...), dónde a es un
átomo. Esto incluye todos los usos de los operadores primitivos,
y existe una cláusula para cada uno.
> (eval. '(eq 'a 'a) '())
t
> (eval. '(cons x '(b c))
'((x a) (y b)))
(a b c)
Todos ellos (excepto quote) llaman
a eval. para encontrar el valor de sus argumentos.
Las dos últimas cláusulas son más complicadas. Para evaluar
una expresión cond llamamos a una función auxiliar
llamada evcond., la cual trabaja a su manera a
través de las cláusulas recursivamente, buscando una en la cual
el primer elemento devuelva t. Cuando encuentra
dicha cláusula devuelve el valor del segundo elemento.
> (eval. '(cond ((atom x) 'atom)
('t 'list))
'((x '(a b))))
list
La parte final de la segunda cláusula
de eval.. Maneja llamadas a funciones que han sido
pasadas como parametros. Trabaja reemplazando el átomo con su
valor (que debería ser una expresión lambda
o label) y evaluando la expresión resultante. Así
(eval. '(f '(b c))
'((f (lambda (x) (cons 'a x)))))
se convierte en
(eval. '((lambda (x) (cons 'a x)) '(b c))
'((f (lambda (x) (cons 'a x)))))
que devuelve (a b c).
Las dos últimas cláusulas en eval. manejan llamadas
a funciones en las cuales el primer argumento es una
expresión lambda o label. Una
expresión label es evaluada empujando la lista del
nombre de la función y la función en si misma dentro del
entorno, y luego llamando a eval. en una expresión
con el lambda interior sustituido por la
expresión label. Esto es,
(eval. '((label firstatom (lambda (x)
(cond ((atom x) x)
('t (firstatom (car x))))))
y)
'((y ((a b) (c d)))))
que se convierte en
(eval. '((lambda (x)
(cond ((atom x) x)
('t (firstatom (car x)))))
y)
'((firstatom
(label firstatom (lambda (x)
(cond ((atom x) x)
('t (firstatom (car x)))))))
(y ((a b) (c d)))))
la cual termina por devolver a.
Finalmente una expresión de la forma ((lambda
(p1...pn) e)
a1...an) es evaluada llamando primero
a evlist. para obtener una lista de
valores (v1 ... vn) de los
argumentos a1 ... an, y luego
evaluando e con (p1 v1)
... (pn vn) agregado al frente del
entorno. Así
(eval. '((lambda (x y) (cons x (cdr y)))
'a
'(b c d))
'())
se convierte en
(eval. '(cons x (cdr y))
'((x a) (y (b c d))))
que termina devolviendo (a c d).
5. Consecuencias
Ahora que se entiende como eval trabaja, volvamos
un paso atras y consideremos lo que significa. Lo que se tiene
aquí es un extraordinariamente elegante modelo de
computación. Usando
sólo quote, atom, eq,
car, cdr, cons,
y cons, se pudo definir una
función, eval., que en realidad implementa nuestro
propio lenguaje, y luego usándo se puede definir cualquier función
adicional que se quiera.
Por supuesto que ya existen modelos de computación-el más
notable es la máquina de Turing. Pero los programas de la
máquina de Turing no son
demasiado fáciles edifying de leer. Si se
quiere un lenguaje para describir algoritmos, se debe desear algo
más abstracto, y ese fue uno de los objetivos de McCarthy al
definir Lisp.
Al lenguaje que él definió en 1960 le faltaba un monton. No
tenía efectos laterales side-effects,
ejecución secuencial (la cual sólo es útil con efectos
laterales), no tenía números prácticos[4] y alcance dinámico. Pero estas
limitaciones pueden ser remediadas, sorprendentemente con
muy código adicional. Steele y Sussman muestran como hacerlo en
un famoso paper llamado "The Art of the Interpreter"[5].
Si se entiende la función eval de McCarthy, se
entiende más que sólo un estadío en la historia de los
lenguajes. Estas ideas están aún presentes en el núcleo
semántico de Lisp en la actualidad. Así que estudiando el paper
original de McCarthy nos muestra, en un sentido, lo que Lisp
realmente es. No es tanto algo que McCarthy diseño sino algo que
descubrió. No es intrínsicamente un lenguaje para AI o para
realizar prototipos rápidos, o cualquier otra tarea de ese
nivel. Es lo que obtienes (o una de las cosas que obtienes)
cuando intentas axiomatizar la
computación axiomatize computation.
En el tiempo, el lenguaje medio, queriendo decir el lenguaje
utilizado por el programador medio, ha ido acercándose
considerablemente a Lisp. Así que entiendiendo eval
estarás entendiendo lo que probablemente sea el principal modelo
computacional en el futuro.
1 Recursive functions of symbolic expressions and their computation by machine (Part I) Communications of the ACM in April 1960. (El paper original) Volver
2 Las expresiones que
comienzan con los otros dos operadores, quote
and cond, son evaluadas de manera diferente. Cuando
una expresión es escapada su argumento no es evaluado, es
simplemente devuelto como el valor de toda la expresión
escapada. Y en una expresión cond válida, sólo un
camino con forma de L de subexpresiones será evaluado.
Volver
3 Lógicamente no se necesita definir una nueva notación para esto. Se puede definir funciones recursivamente con la notación que se tiene hasta el momento usando una función en funciones llamada Y combinator. Puede que McCarthy no supiese acerca del Y combinator cuando escribió su paper, en cualquier caso la notación con etiqueta (labe) es más leíble. Volver
4
Es posible realizar aritmética en el Lisp de McCarthy de 1960
utilizando una lista de n átomos para representar
el número n.
Volver
5 Guy Lewis Steele, Jr. y Gerald Jay Sussman, "The Art of the interpreter, or the Modularity Complex (Part Zero, One, and Two)," MIT AI Lab Memo 453, Mayo de 1978. Volver
Publicado por
santi
en
10:21 PM
0
comentarios
Etiquetas: lenguajes de programación, lisp
pequeña nota mental
Acordarse para mañanaa de memorizar esto:
################################################## ##################################################
# ECB keystrokes. # # GNUS keystrokes. #
################################################## ##################################################
C-c . , ecb-cycle-maximized-ecb-buffers C-d gnus-summary-enter-digest-group
C-c . . ecb-cycle-through-compilation-buffers C-k gnus-summary-kill-same-subject
C-c . / ecb-toggle-compile-window-height C-l gnus-recenter
C-c . \ ecb-toggle-compile-window RET gnus-summary-scroll-up
C-c . a ecb-toggle-auto-expand-tag-tree C-o gnus-summary-save-article-mail
C-c . e eshell C-t gnus-summary-toggle-truncation
C-c . f Prefix Command C-w gnus-summary-mark-region-as-read
C-c . g Prefix Command C-x Prefix Command
C-c . h ecb-show-help ESC Prefix Command
C-c . l Prefix Command SPC gnus-summary-next-page
C-c . m Prefix Command ! gnus-summary-tick-article-forward
C-c . n ecb-nav-goto-next # gnus-summary-mark-as-processable
C-c . o ecb-toggle-scroll-other-window-scrolls-compile & gnus-summary-execute-command
C-c . p ecb-nav-goto-previous * gnus-cache-enter-article
C-c . r ecb-rebuild-methods-buffer , gnus-summary-best-unread-article
C-c . s ecb-window-sync - negative-argument
C-c . x ecb-expand-methods-nodes . gnus-summary-first-unread-article
/ gnus-summary-limit-map
C-c . m a ecb-maximize-window-analyse 0 .. 9 digit-argument
C-c . m b ecb-maximize-window-speedbar < gnus-summary-beginning-of-article
C-c . m d ecb-maximize-window-directories = gnus-summary-expand-window
C-c . m h ecb-maximize-window-history > gnus-summary-end-of-article
C-c . m m ecb-maximize-window-methods ? gnus-summary-mark-as-dormant
C-c . m s ecb-maximize-window-sources A gnus-summary-article-map
B gnus-summary-backend-map
C-c . g 1 ecb-goto-window-edit1 C gnus-summary-cancel-article
C-c . g 2 ecb-goto-window-edit2 D gnus-summary-mark-as-read-backward
C-c . g a ecb-goto-window-analyse E gnus-summary-mark-as-expirable
C-c . g b ecb-goto-window-speedbar F gnus-summary-followup-with-original
C-c . g c ecb-goto-window-compilation G gnus-summary-goto-map
C-c . g d ecb-goto-window-directories H gnus-summary-help-map
C-c . g h ecb-goto-window-history I gnus-summary-increase-score
C-c . g l ecb-goto-window-edit-last K gnus-summary-mime-map
C-c . g m ecb-goto-window-methods L gnus-summary-lower-score
C-c . g s ecb-goto-window-sources M gnus-summary-mark-map
N gnus-summary-next-article
C-c . l c ecb-change-layout O gnus-summary-save-map
C-c . l r ecb-redraw-layout P gnus-summary-prev-article
C-c . l t ecb-toggle-layout Q gnus-summary-exit-no-update
C-c . l w ecb-toggle-ecb-windows R gnus-summary-reply-with-original
S gnus-summary-send-map
C-c . f c ecb-methods-filter-current-type T gnus-summary-thread-map
C-c . f f ecb-methods-filter-function U gnus-summary-tick-article-backward
C-c . f h ecb-history-filter V gnus-summary-score-map
C-c . f l ecb-methods-filter-delete-last W gnus-summary-wash-map
C-c . f m ecb-methods-filter X gnus-uu-extract-map
C-c . f n ecb-methods-filter-nofilter Y gnus-summary-buffer-map
C-c . f p ecb-methods-filter-protection Z gnus-summary-exit-map
C-c . f r ecb-methods-filter-regexp ^ gnus-summary-refer-parent-article
C-c . f s ecb-sources-filter a gnus-summary-post-news
C-c . f t ecb-methods-filter-tagclass b gnus-article-view-part
################################################## ##################################################
# GNUS keystrokes. # # GNUS keystrokes. #
################################################## ##################################################
c gnus-summary-catchup-and-exit T u gnus-summary-up-thread
d gnus-summary-mark-as-read-forward
e gnus-summary-edit-article V C gnus-score-customize
f gnus-summary-followup V F gnus-score-flush-cache
g gnus-summary-show-article V R gnus-summary-rescore
h gnus-summary-select-article-buffer V S gnus-summary-current-score
i gnus-summary-news-other-window V c gnus-score-change-score-file
j gnus-summary-goto-article V e gnus-score-edit-current-scores
k gnus-summary-kill-same-subject-and-select V f gnus-score-edit-file
l gnus-summary-goto-last-article V m gnus-score-set-mark-below
m gnus-summary-mail-other-window V s gnus-summary-set-score
n gnus-summary-next-unread-article V t gnus-score-find-trace
o gnus-summary-save-article V w gnus-score-find-favourite-words
p gnus-summary-prev-unread-article V x gnus-score-set-expunge-below
q gnus-summary-exit
r gnus-summary-reply W 6 gnus-article-de-base64-unreadable
s gnus-summary-isearch-article W B gnus-article-add-buttons-to-head
t gnus-summary-toggle-header W C gnus-article-capitalize-sentences
u gnus-summary-tick-article-forward W D gnus-summary-wash-display-map
w gnus-summary-stop-page-breaking W E gnus-summary-wash-empty-map
x gnus-summary-limit-to-unread W G gnus-summary-wash-header-map
| gnus-summary-pipe-output W H gnus-summary-wash-highlight-map
DEL gnus-summary-prev-page W M gnus-summary-wash-mime-map
W Q gnus-article-fill-long-lines
gnus-summary-next-thread W T gnus-summary-wash-time-map
gnus-summary-prev-thread W W gnus-summary-wash-hide-map
gnus-summary-prev-page W Y gnus-summary-wash-deuglify-map
gnus-summary-prev-page W Z gnus-article-decode-HZ
mouse-face W a gnus-article-strip-headers-in-body
gnus-mouse-pick-article W b gnus-article-add-buttons
Prefix Command W c gnus-article-remove-cr
W d gnus-article-treat-dumbquotes
C-c C-b gnus-bug W e gnus-article-emphasize
C-c C-d gnus-summary-describe-group W f gnus-article-display-x-face
C-c C-f gnus-summary-mail-forward W g gnus-treat-smiley
C-c TAB gnus-info-find-node W h gnus-article-wash-html
C-c C-r gnus-summary-caesar-message W l gnus-summary-stop-page-breaking
C-c C-s Prefix Command W m gnus-summary-morse-message
C-c C-v Prefix Command W o gnus-article-treat-overstrike
C-c ESC Prefix Command W p gnus-article-verify-x-pgp-sig
W q gnus-article-de-quoted-unreadable
C-x C-s gnus-summary-reselect-current-group W r gnus-summary-caesar-message
W s gnus-summary-force-verify-and-decrypt
C-M-a gnus-summary-customize-parameters W t gnus-summary-toggle-header
C-M-b gnus-summary-prev-thread W u gnus-article-unsplit-urls
C-M-d gnus-summary-read-document W v gnus-summary-verbose-headers
C-M-e gnus-summary-edit-parameters W w gnus-article-fill-cited-article
C-M-f gnus-summary-next-thread
C-M-h gnus-summary-hide-thread X B gnus-uu-decode-binhex
C-M-k gnus-summary-kill-thread X O gnus-uu-decode-save
C-M-l gnus-summary-lower-thread X P gnus-uu-decode-postscript-and-save
M-RET gnus-summary-scroll-down X S gnus-uu-decode-unshar-and-save
C-M-n gnus-summary-next-same-subject X U gnus-uu-decode-uu-and-save
C-M-p gnus-summary-prev-same-subject X b gnus-uu-decode-binhex
C-M-s gnus-summary-show-thread X m gnus-summary-save-parts
C-M-t gnus-summary-toggle-threads X o gnus-uu-decode-save
C-M-u gnus-summary-up-thread X p gnus-uu-decode-postscript
M-# gnus-summary-unmark-as-processable X s gnus-uu-decode-unshar
M-& gnus-summary-universal-argument X u gnus-uu-decode-uu
M-* gnus-cache-remove-article X v gnus-uu-extract-view-map
M-K gnus-summary-edit-global-kill
M-U gnus-summary-clear-mark-backward Y c gnus-summary-insert-cached-articles
M-^ gnus-summary-refer-article Y d gnus-summary-insert-dormant-articles
M-g gnus-summary-rescan-group Y g gnus-summary-prepare
M-i gnus-symbolic-argument
M-k gnus-summary-edit-local-kill Z C gnus-summary-catchup-all-and-exit
M-n gnus-summary-next-unread-subject Z E gnus-summary-exit-no-update
M-p gnus-summary-prev-unread-subject Z G gnus-summary-rescan-group
M-r gnus-summary-search-article-backward Z N gnus-summary-next-group
M-s gnus-summary-search-article-forward Z P gnus-summary-prev-group
M-t gnus-summary-toggle-display-buttonized Z Q gnus-summary-exit
M-u gnus-summary-clear-mark-forward Z R gnus-summary-reselect-current-group
Z Z gnus-summary-exit
/ * gnus-summary-limit-include-cached Z c gnus-summary-catchup-and-exit
/ . gnus-summary-limit-to-unseen Z n gnus-summary-catchup-and-goto-next-group
/ / gnus-summary-limit-to-subject Z s gnus-summary-save-newsrc
/ C gnus-summary-limit-mark-excluded-as-read
/ D gnus-summary-limit-include-dormant C-c C-v C-v gnus-uu-decode-uu-view
/ E gnus-summary-limit-include-expunged
/ M gnus-summary-limit-exclude-marks C-c C-s C-a gnus-summary-sort-by-author
/ N gnus-summary-insert-new-articles C-c C-s C-c gnus-summary-sort-by-chars
/ T gnus-summary-limit-include-thread C-c C-s C-d gnus-summary-sort-by-date
/ a gnus-summary-limit-to-author C-c C-s TAB gnus-summary-sort-by-score
/ c gnus-summary-limit-exclude-childless-dormant C-c C-s C-l gnus-summary-sort-by-lines
/ d gnus-summary-limit-exclude-dormant C-c C-s C-n gnus-summary-sort-by-number
/ m gnus-summary-limit-to-marks C-c C-s C-o gnus-summary-sort-by-original
/ n gnus-summary-limit-to-articles C-c C-s C-r gnus-summary-sort-by-random
/ o gnus-summary-insert-old-articles C-c C-s C-s gnus-summary-sort-by-subject
/ p gnus-summary-limit-to-display-predicate
/ s gnus-summary-limit-to-subject C-c C-M-s gnus-summary-limit-include-expunged
/ t gnus-summary-limit-to-age
/ u gnus-summary-limit-to-unread A M-RET gnus-summary-scroll-down
/ v gnus-summary-limit-to-score
/ w gnus-summary-pop-limit B C-M-e gnus-summary-expire-articles-now
/ x gnus-summary-limit-to-extra
G M-n gnus-summary-next-unread-subject
A RET gnus-summary-scroll-up G M-p gnus-summary-prev-unread-subject
A ESC Prefix Command
A SPC gnus-summary-next-page M M ! Prefix Command
A < gnus-summary-beginning-of-article M M ? Prefix Command
A > gnus-summary-end-of-article M M d Prefix Command
A D gnus-summary-enter-digest-group M M e Prefix Command
A M gnus-mailing-list-insinuate M M u Prefix Command
A P gnus-summary-print-article
A R gnus-summary-refer-references M V c gnus-summary-clear-above
A T gnus-summary-refer-thread M V k gnus-summary-kill-below
A ^ gnus-summary-refer-parent-article M V m gnus-summary-mark-above
A b gnus-summary-beginning-of-article M V u gnus-summary-tick-above
A e gnus-summary-end-of-article
A g gnus-summary-show-article M P G gnus-uu-unmark-by-regexp
A n gnus-summary-next-page M P R gnus-uu-mark-by-regexp
A p gnus-summary-prev-page M P S gnus-uu-mark-sparse
A r gnus-summary-refer-parent-article M P T gnus-uu-unmark-thread
A s gnus-summary-isearch-article M P U gnus-summary-unmark-all-processable
A t gnus-article-babel M P a gnus-uu-mark-all
A DEL gnus-summary-prev-page M P b gnus-uu-mark-buffer
A gnus-summary-prev-page M P g gnus-uu-unmark-region
M P i gnus-uu-invert-processable
B ESC Prefix Command M P k gnus-summary-kill-process-mark
B B gnus-summary-crosspost-article M P p gnus-summary-mark-as-processable
B I gnus-summary-create-article M P r gnus-uu-mark-region
B c gnus-summary-copy-article M P s gnus-uu-mark-series
B e gnus-summary-expire-articles M P t gnus-uu-mark-thread
B i gnus-summary-import-article M P u gnus-summary-unmark-as-processable
B m gnus-summary-move-article M P v gnus-uu-mark-over
B p gnus-summary-article-posted-p M P w gnus-summary-save-process-mark
B q gnus-summary-respool-query M P y gnus-summary-yank-process-mark
B r gnus-summary-respool-article
B t gnus-summary-respool-trace M M-# gnus-summary-unmark-as-processable
B w gnus-summary-edit-article
B DEL gnus-summary-delete-article S D b gnus-summary-resend-bounced-mail
B gnus-summary-delete-article S D e gnus-summary-resend-message-edit
B gnus-summary-delete-article S D r gnus-summary-resend-message
G C-n gnus-summary-next-same-subject S O m gnus-uu-digest-mail-forward
G C-p gnus-summary-prev-same-subject S O p gnus-uu-digest-post-forward
G ESC Prefix Command
G N gnus-summary-next-article S o m gnus-summary-mail-forward
G P gnus-summary-prev-article S o p gnus-summary-post-forward
G b gnus-summary-best-unread-article
G f gnus-summary-first-unread-article S B R gnus-summary-reply-broken-reply-to-with-original
G g gnus-summary-goto-subject S B r gnus-summary-reply-broken-reply-to
G j gnus-summary-goto-article
G l gnus-summary-goto-last-article S M-c gnus-summary-mail-crosspost-complaint
G n gnus-summary-next-unread-article
G o gnus-summary-pop-article T M-# gnus-uu-unmark-thread
G p gnus-summary-prev-unread-article
W E A gnus-article-strip-all-blank-lines
H C gnus-group-fetch-control W E a gnus-article-strip-blank-lines
H c gnus-group-fetch-charter W E e gnus-article-strip-trailing-space
H d gnus-summary-describe-group W E l gnus-article-strip-leading-blank-lines
H f gnus-summary-fetch-faq W E m gnus-article-strip-multiple-blank-lines
H h gnus-summary-describe-briefly W E s gnus-article-strip-leading-space
H i gnus-info-find-node W E t gnus-article-remove-trailing-blank-lines
H v gnus-version W E w gnus-article-remove-leading-whitespace
K C gnus-article-view-part-as-charset W T e gnus-article-date-lapsed
K E gnus-article-encrypt-body W T i gnus-article-date-iso8601
K b gnus-summary-display-buttonized W T l gnus-article-date-local
K c gnus-article-copy-part W T o gnus-article-date-original
K e gnus-article-view-part-externally W T p gnus-article-date-english
K i gnus-article-inline-part W T s gnus-article-date-user
K m gnus-summary-repair-multipart W T u gnus-article-date-ut
K o gnus-article-save-part W T z gnus-article-date-ut
K v gnus-article-view-part
K | gnus-article-pipe-part W M b gnus-article-view-part
W M c gnus-article-decode-charset
M C-c gnus-summary-catchup-all W M v gnus-mime-view-all-parts
M ESC Prefix Command W M w gnus-article-decode-mime-words
M SPC gnus-summary-clear-mark-forward
M ! gnus-summary-tick-article-forward W D D gnus-article-remove-images
M # gnus-summary-mark-as-processable W D d gnus-article-display-face
M ? gnus-summary-mark-as-dormant W D f gnus-treat-from-picon
M B gnus-summary-remove-bookmark W D m gnus-treat-mail-picon
M C gnus-summary-catchup W D n gnus-treat-newsgroups-picon
M H gnus-summary-catchup-to-here W D s gnus-treat-smiley
M K gnus-summary-kill-same-subject W D x gnus-article-display-x-face
M M Prefix Command
M P gnus-uu-mark-map W G f gnus-article-treat-fold-headers
M S gnus-summary-limit-include-expunged W G n gnus-article-treat-fold-newsgroups
M V gnus-summary-mscore-map W G u gnus-article-treat-unfold-headers
M b gnus-summary-set-bookmark
M c gnus-summary-clear-mark-forward W H a gnus-article-highlight
M d gnus-summary-mark-as-read-forward W H c gnus-article-highlight-citation
M e gnus-summary-mark-as-expirable W H h gnus-article-highlight-headers
M h gnus-summary-catchup-from-here W H s gnus-article-highlight-signature
M k gnus-summary-kill-same-subject-and-select
M r gnus-summary-mark-as-read-forward W W C-c gnus-article-hide-citation-maybe
M t gnus-summary-tick-article-forward W W B gnus-article-strip-banner
M x gnus-summary-mark-as-expirable W W C gnus-article-hide-citation-in-followups
W W P gnus-article-hide-pem
O B gnus-summary-write-article-body-file W W a gnus-article-hide
O F gnus-summary-write-article-file W W b gnus-article-hide-boring-headers
O P gnus-summary-muttprint W W c gnus-article-hide-citation
O b gnus-summary-save-article-body-file W W h gnus-article-hide-headers
O f gnus-summary-save-article-file W W l gnus-article-hide-list-identifiers
O h gnus-summary-save-article-folder W W s gnus-article-hide-signature
O m gnus-summary-save-article-mail
O o gnus-summary-save-article W Y a gnus-article-outlook-repair-attribution
O p gnus-summary-pipe-output W Y c gnus-article-outlook-rearrange-citation
O r gnus-summary-save-article-rmail W Y f gnus-article-outlook-deuglify-article
O s gnus-soup-add-article W Y u gnus-article-outlook-unwrap-lines
O v gnus-summary-save-article-vm
X v B gnus-uu-decode-binhex-view
S ESC Prefix Command X v O gnus-uu-decode-save-view
S B Prefix Command X v P gnus-uu-decode-postscript-and-save-view
S D gnus-send-bounce-map X v S gnus-uu-decode-unshar-and-save-view
S F gnus-summary-followup-with-original X v U gnus-uu-decode-uu-and-save-view
S N gnus-summary-followup-to-mail-with-original X v b gnus-uu-decode-binhex-view
S O Prefix Command X v o gnus-uu-decode-save-view
S R gnus-summary-reply-with-original X v p gnus-uu-decode-postscript-view
S V gnus-summary-very-wide-reply-with-original X v s gnus-uu-decode-unshar-view
S W gnus-summary-wide-reply-with-original X v u gnus-uu-decode-uu-view
S c gnus-summary-cancel-article
S f gnus-summary-followup M M e N gnus-summary-put-mark-as-expirable-next-unread
S i gnus-summary-news-other-window M M e P gnus-summary-put-mark-as-expirable-prev-unread
S m gnus-summary-mail-other-window M M e e gnus-summary-put-mark-as-expirable
S n gnus-summary-followup-to-mail M M e n gnus-summary-put-mark-as-expirable-next
S o Prefix Command M M e p gnus-summary-put-mark-as-expirable-prev
S p gnus-summary-post-news
S r gnus-summary-reply M M ? ? gnus-summary-put-mark-as-dormant
S s gnus-summary-supersede-article M M ? N gnus-summary-put-mark-as-dormant-next-unread
S u gnus-uu-post-news M M ? P gnus-summary-put-mark-as-dormant-prev-unread
S v gnus-summary-very-wide-reply M M ? n gnus-summary-put-mark-as-dormant-next
S w gnus-summary-wide-reply M M ? p gnus-summary-put-mark-as-dormant-prev
S y gnus-summary-yank-message
M M ! ! gnus-summary-put-mark-as-ticked
T ESC Prefix Command M M ! N gnus-summary-put-mark-as-ticked-next-unread
T # gnus-uu-mark-thread M M ! P gnus-summary-put-mark-as-ticked-prev-unread
T H gnus-summary-hide-all-threads M M ! n gnus-summary-put-mark-as-ticked-next
T S gnus-summary-show-all-threads M M ! p gnus-summary-put-mark-as-ticked-prev
T T gnus-summary-toggle-threads
T ^ gnus-summary-reparent-thread M M u N gnus-summary-put-mark-as-unread-next-unread
T d gnus-summary-down-thread M M u P gnus-summary-put-mark-as-unread-prev-unread
T h gnus-summary-hide-thread M M u n gnus-summary-put-mark-as-unread-next
T i gnus-summary-raise-thread M M u p gnus-summary-put-mark-as-unread-prev
T k gnus-summary-kill-thread M M u u gnus-summary-put-mark-as-unread
T l gnus-summary-lower-thread
T n gnus-summary-next-thread M M d N gnus-summary-put-mark-as-read-next-unread
T o gnus-summary-top-thread M M d P gnus-summary-put-mark-as-read-prev-unread
T p gnus-summary-prev-thread M M d d gnus-summary-put-mark-as-read
T s gnus-summary-show-thread M M d n gnus-summary-put-mark-as-read-next
T t gnus-summary-rethread-current M M d p gnus-summary-put-mark-as-read-prev
Sí, y ustedes se creían duros memorizando decimales de pi. Y esto son sólo dos aplicaciones de GNU/Emacs: ECB y Gnus.
2/16/2008
Flymake en php
Agenden esta extensión para flymake, que te cambia la vida. :)
Publicado por
santi
en
7:38 PM
1 comentarios
2/12/2008
Filtrar procesos con psgrep para bash
Una alias/función fundamental para cualquier usuario de BASH en
GNU/Linux. Agregarle a tu .bashrc:
psgrep()
{
ps aux | grep $1 | grep -v grep
}
Luego lo usas así:
psgrep xmms
Útil. ¿No? Muchísimos trucos más pueden encontrarle al bash si instalan su documentación:
sudo aptitude install bash-doc
Luego navegan el
directorio /usr/share/doc/bash-doc/examples
Publicado por
santi
en
4:01 PM
0
comentarios
2/10/2008
Probando g-client en emacs 22
Estamos probando hacer un post directamente desde Emacs, utilizando el cliente para servicios de google. Veremos si anda bien.
Si lo quieren probar, los pasos son más o menos los siguientes:
# sudo aptitude install curl w3m
# svn -co http://emacspeak.googlecode.com/svn/trunk/lisp/g-client/
# make
Ahora editas tu ~/.emacs
(push "~/g-client" load-path)
(load-library "g")
(setq g-user-email "example@gmail.com")
(setq g-html-handler 'browse-url-of-buffer)
(setq browse-url-browser-function 'w3m-browse-url)
Haces un M-x eval-buffer, luego
un gblogger-blog y listo!
Publicado por
santi
en
10:08 PM
0
comentarios
