DRY up your Enumerations in Common Lisp

http://www.devchix.com/2007/05/25/ruby-dry-up-your-enumerations/

Common Lispならマクロの出る幕すらない。

(defstruct stooge :name :hair :habit)

(defparameter *stuff*
  (vector
   (make-stooge :name "Mo" :hair "bowly" :habit "eye poking")
   (make-stooge :name "Larry" :hair "curly" :habit "whomping")
   (make-stooge :name "Curly" :hair nil :habit "whining")))

(defun baldish? (x)
  (null (stooge-hair x)))

(defun is (field value)
  (lambda (stooge)
    (equal (slot-value stooge field) value)))

(defun name-is (value)
  (is :name value))

(defun defalias (new func)
  (setf (symbol-function new) func))

(defalias 'select #'remove-if-not)

;; @stooges.that.are.baldish?
(select #'baldish? *stuff*)

;; @stooges.that.have.name == ‘Mo’
(remove-if-not (lambda (x) (equal (stooge-name x) "Mo")) *stuff*)
(select (name-is "Mo") *stuff*)

;; @stooges.extract.name
(map 'vector #'stooge-name *stuff*)

;; @stooges.all.are.baldish?  # false
(every #'baldish? *stuff*)

;; @stooges.any.are.baldish?  # true
(some #'baldish? *stuff*)

;; @stooges.all.are_not.baldish?  # false
(every (complement #'baldish?) *stuff*)

;; @stooges.any.are_not.baldish?  # true
(some (complement #'baldish?) *stuff*)

;; @stooges.all.have.name == ‘Mo’  # false
(every (name-is "Mo") *stuff*)

;; @stooges.any.have.name == ‘Mo’  # true
(some (name-is "Mo") *stuff*)

JavaScript対応のテキストブラウザ…

http://d.hatena.ne.jp/khiker/20070620/text_browser

id:khikerさんのエントリ。
俺もJavaScript対応のテキストブラウザが欲しい。w3m-jsを以前試してみたが使い勝手がよくなかった。
しょうがないのでfirefox(conkeror)を常駐し、自動で再起動するようにしてある。

このshell script(retry.sh)で retry.sh iceweasel とやっている。(実際はウィンドウマネージャーとの兼ね合いでもっと複雑)

#!/bin/sh
$@ ;   sleep 0.05; exec $0 $@

keywordテキストブラウザについて

keyword:テキストブラウザ

「フォントと画面サイズが固定されるという問題はある」とあるが、俺はそれが逆にメリットだと考えている。小さい字にされると読みづらいんじゃボケー!
色が固定されるのも俺的にはメリット。
常に黒地に白字で作業しているから、明るい背景色だと眩しすぎる。

HyperSpec辞書引きLocal CGI

http://d.hatena.ne.jp/mitsygh/20070620/1182365173

id:mitsyghさんのエントリ。同じようなこと考える人はいるものだ。

EmacsだとSLIMEで存在する。HyperSpecのデータベースはelisp側が持っているので外部プログラム側がそれを使いたければgnudoit経由で取り出すしかない。

これはw3mのLocal CGIスクリプトhyperspec.cgi

#!/usr/bin/env ruby
## from mylib.rb
class << IO
  # Redirect stdout to STDOUT and executes the block.
  def redirect(stdout)
    begin
      stdout_sv = STDOUT.dup
      STDOUT.reopen(stdout)
      yield
    ensure
      STDOUT.flush
      STDOUT.reopen(stdout_sv)
    end
  end
end

require 'tmpdir'
require 'fileutils'
@@__system_to_string_count__ = 0
def system_to_string(*args)
  begin
    tmpf = File.join(Dir.tmpdir, "#{$$}-#{@@__system_to_string_count__}")
    @@__system_to_string_count__ += 1
    ret = nil
    open(tmpf,"w") do |f|
      IO.redirect(f) {
        system *args
      }
    end
    File.read(tmpf)
  ensure
    FileUtils.rm_f tmpf
  end
end

## /mylib.rb

func = ENV['QUERY_STRING'].sub(/hyperspec:/, '')

lisp = <<'XXX'
(let* (tmpurl
       (browse-url-browser-function (lambda (x &rest args) (setq tmpurl x))))
  (common-lisp-hyperspec "%s")
  tmpurl)
XXX

url = system_to_string "gnudoit", lisp % func
print "Location: #{url}\r\n\r\n"

firefox拡張

http://d.hatena.ne.jp/khiker/20070617/firefox_devcon_2007

firefoxの拡張って楽しそうなんだが、そんなにfirefox自体使ってないんだよね。いつもw3mJavaScriptが必要なときに仕方なく使う程度なので。
w3mヘビーユーザの俺に言わせれば、DOMとかをJavaScriptでいぢれるのが羨しい。