String interpolation for xyzzy Lisp
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
site-lisp
.gitignore
CHANGELOG
COPYING
ChangeLog.xl-interpol
History.rdoc
MANIFEST.yml
README.rdoc

README.rdoc

xl-interpol - String interpolation for xyzzy Lisp

SYNOPSIS

(require "xl-interpol")

(interpol:enable-interpol-syntax)

#.(setf interpol:*try-hex-notation-p* t)
(defun greeting (name)
  #?"\N{HIRAGANA LETTER YA}\N{U+3042} ${name}!")
#.(setf interpol:*try-hex-notation-p* nil)

(defun calc-add (a b)
  #?"a = ${a}, b = ${b}, a + b = ${(+ a b)}")

(defun scan-numbers (str)
  (mapcar #'parse-integer
          (ppcre:all-matches-as-strings #?/\d+/ str)))

(greeting "xyzzy")
;=> "やあ xyzzy!"

(calc-add 1 2)
;=> "a = 1, b = 2, a + b = 3"

(let* ((str "123 foobar 456 hoge 789")
       (nums (scan-numbers str)))
  (let ((interpol:*list-delimiter* " と "))
    (princ #?<"${str}" に含まれている数字は @{nums} です。\n合計は ${(apply '+ nums)} です。>))
  nil)
;=> "123 foobar 456 hoge 789" に含まれている数字は 123 と 456 と 789 です。
;   合計は 1368 です。
;   nil

(interpol:disable-interpol-syntax)

Yahoo Japan! で検索して結果を表示するサンプル

(require "xl-interpol")
(require "xl-ppcre")

(interpol:enable-interpol-syntax)

(defparameter *yahoo-search-result-scanner*
  (ppcre:create-scanner
   #?rx(                    ; 拡張正規表現
        <div\ class="hd">
        .*?
        <a .*? href="(.*?)" .*? >   # $1 = link
          (.*?)                     # $2 = title
        </a>
        .*?
        <div\ class="bd">
          <p>
            (.*?)                   # $3 = snippet
          </p>
        )
   :case-insensitive-mode t ; タグの大文字小文字の違いは無視
   :single-line-mode t      ; ドットが改行にもマッチするようにする
   ))

(interpol:disable-interpol-syntax)

(defun cleanup-text (html)
  (string-trim " \n" (substitute-string html "<[^<>]+>" "")))

(defun scan-yahoo-search-result (res)
  (let (result)
    (ppcre:do-register-groups (url
                               (#'cleanup-text title)
                               (#'cleanup-text snippet))
      (*yahoo-search-result-scanner*
       (xhr:xhr-response-text res)
       (nreverse result))
      (push (list url title snippet) result))))

(defun yahoo-search (query)
  (xhr:xhr-get "http://search.yahoo.co.jp/search"
               :query `(:ei "UTF-8" :p ,query)
               :encoding *encoding-utf8n*
               :since :epoch
               :key #'scan-yahoo-search-result
               ))

(yahoo-search "cl-ppcre")

DESCRIPTION

xl-interpol は CL-INTERPOL - String interpolation for Common Lisp を xyzzy に移植したものです。

xl-interpol は以下の機能を提供しています。

  • 変数や式を文字列に埋め込める

  • 正規表現リテラル

  • ユニコード文字 (\N{HIRAGANA LETTER A})

INSTALL

  1. NetInstaller で xl-interpol, xl-ppcre, ansi-loop, ansify をインストールします。

  2. xl-interpol はライブラリであるため自動的にロードはされません。 必要な時点で require してください。

REFERENCE

パッケージ名は xl-interpol (ニックネームは interpol) です。

詳細は CL-INTERPOL - String interpolation for Common Lisp を参照してください。

以下の変数は cl-interpol (cl-unicode) との互換性のために定義してありますが機能しません。

  • *try-unicode1-names-p*

  • *try-abbreviations-p*

  • *scripts-to-try*

TODO

なし。

KNOWN BUGS

なし。

要望やバグは GitHub Issues@miyamuko まで。

AUTHOR

みやむこ かつゆき <miyamuko@gmail.com>

COPYRIGHT

xl-interpol は BSD ライセンスに従って本ソフトウェアを使用、再配布することができます。

Copyright (c) 2011 MIYAMUKO Katsuyuki.
Copyright (c) 2003-2008, Dr. Edmund Weitz. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following
    disclaimer in the documentation and/or other materials
    provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.