fn 20170209.1804(in MELPA)
Concise anonymous functions for Emacs Lisp

概要

Emacs Lispの無名関数lambdaは
冗長だと感じませんか?

fn.el は無名関数を
コンパクトに書く方法を提供します。

たとえば、こんなふうに。

(lambda (x) x)
;; 
(fn <>)

(lambda (x y) (list x y))
;; 
(fn (list <1> <2>))

(lambda (x &rest r) (list x r))
;; 
(fn (list <1> <rest>))

fnの中では以下の記法で引数を参照します。

  • <> は最初の引数
  • <1><9> はN+1番目の引数
  • <rest> は残りの引数

fn は複数個の式を置けますが、
1つの式からなる無名関数は
fn: という簡易記法も用意されています。

(lambda (x y) (list x y))
;; 
(fn (list <1> <2>))
;; 
(fn: list <1> <2>)

通常のラムダ式と比べると
圧倒的に短くなったのがわかるでしょう。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてfnを使う方は
以下のコマンドを実行します。

M-x package-install fn

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name fn

使用例

(setq 0-5 (number-sequence 0 5))        ; => (0 1 2 3 4 5)
(mapcar (lambda (x) (* x x)) 0-5)       ; => (0 1 4 9 16 25)
(mapcar (fn (* <> <>)) 0-5)             ; => (0 1 4 9 16 25)
(mapcar (fn: * <> <>) 0-5)              ; => (0 1 4 9 16 25)

(funcall (fn (setq x 3)
             (list x <1> <2> <rest>))
         "foo" "bar" "rest1" "rest2")   ; => (3 "foo" "bar" ("rest1" "rest2"))
(funcall (fn (setq x 3)
             (list x <> <> <>))
         "foo" "bar" "rest1" "rest2")   ; => (3 "foo" "foo" "foo")

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。