newLISP マニュアル v.10.6.0 日本語訳公開

 if が anaphoric if になり、macro組込関数に昇格した安定版のリリースです。
 特に macro.lsp を使っている人は、ロードしないように気を付けましょう(笑)
 もちろん、ウェブ・ブラウザ上の newLISP in a browser も v.10.6.0 になっていますから、インストールしなくても試せます。
 ということで、newLISP の User Manual and ReferenceGUI functionsCode Patterns の全訳のリリースです。

newlisp_manual-10600
guiserver_manual-161
CodePatterns-10507
こちらからダウンロードしてください。

 目次も含め日本語併記にしてあります。
 Lutz氏のご好意によりこちらから見ることもできます。

 いつものように、間違いやおかしな点が有りましたら、こちらの blog までご一報ください。

 以上、如何でしょうか?

newLISP マニュアル v.10.5.8 開発版日本語訳公開

 v.10.5.8 から、macro が組込関数に昇格します。つまり、macro.lsp を読み込まなくても使えるようになると言うこと。
 マニュアルにある macro の動作例を試すには、v.10.5.8 をインストールしなくても、ウェブ・ブラウザ上の newLISP in a browser で試せます。便利ですね(笑)
 そろそろ、安定版のリリースも近い?
 さて、開発版 newLISP の User Manual and Reference の全訳のリリースです。

newlisp_manual-10508
こちらからダウンロードしてください。

 目次も含め日本語併記にしてあります。

 いつものように、間違いやおかしな点が有りましたら、こちらの blog までご一報ください。

 以上、如何でしょうか?

ウェブ・ブラウザで newLISP チュートリアル

 JavaScript 版 newLISP を使った newLISP チュートリアルが、ここにあります。

http://www.newlisp.org/newlisp-js/index.html

 考えてみれば、newLISP をインストールしなくてもウェブ上で使える JavaScript 版 newLISP 。チュートリアルに持って来いですよね。さずが、Lutz 氏。
 チュートリアルのベースは〝Introduction to newLISP〟。まだ、〝The basics〟編だけですが、順次残りも載る予定のようです。(2014/2/18追記:tutorial.lsp が無くなり。代わりに index.html に 〝Introduction to newLISP〟の紹介が記載されるようになりました。よって、”tutorial-jp.lsp” の掲載も外します)
  そこで、”tutorial.lsp” の日本語併記版”tutorial-jp.lsp”を用意しました。

newlisp_manual-10507
こちらからダウンロードしてください。

 中には、開発版 newLISP の User Manual and Reference と JavaScript 版 newLISP の使い方である README.html の全訳も入っています。
  newLISP サイトの “index.html” 下部の open ボタンをクリックして、ダウンロードしたzipファイル内の “tutorial-jp.lsp” を読み込んでから、eval ボタンをクリックすれば日本併記のチュートリアルが始まります。
 zipファイル内の “index-jp.html” を使えば、info ボタンや doc ボタンで日本語併記の html が表示されます。但し、”newlisp-js-lib.js” が別途必要ですので、こちらからダウンロードして同じフォルダーに置いてください。

 以上、如何でしょうか?

newLISP マニュアル v.10.5.7 開発版日本語訳公開

 この開発版の目玉は何といっても newlisp-js-lib.jsJavaScript 版 newLISP です。
 つまり、ウェブ・ブラウザで JavaScript のように newLISP が使えるのです!
 使い方は、同梱の “README.html” でどうぞ。(日本語版は、下の URL からダウンロードできます)
 newLISP の全ての関数が使えるわけでもありませんが、これを使えば newLISP の入出力をブラウザで簡単に行えるかも。”README.html” の他に同梱の “index.html” や “app.html” が参考になります。
 また、JavaScript 版 newLISP 専用の関数もありますので、詳細はマニュアルの日本語訳をどうぞ。

 開発版 newLISP の User Manual and Reference と README.html の全訳のリリースです。

newlisp_manual-10507
こちらからダウンロードしてください。

 目次も含め日本語併記にしてあります。

 いつものように、間違いやおかしな点が有りましたら、こちらの blog までご一報ください。

 以上、如何でしょうか?

newLISP マニュアル v.10.5.6 開発版日本語訳公開

 このバージョンは開発版ですが、ifanaphoric if に変身しています。どういう事かと言うと、if の条件式の結果をシステム変数 $it で参照できるのです。と言うことは拙作 aif が不要に、、、
 冗談はさておき、Lutz 氏に感謝!ますます使いやすくなる newLISP です。
 さて、詳細はマニュアルの日本語訳でどうぞ(笑)。

 newLISP の User Manual and Reference の全訳のリリースです。

newlisp_manual-10506
こちらからダウンロードしてください。

 目次も含め日本語併記にしてあります。

 いつものように、間違いやおかしな点が有りましたら、こちらの blog までご一報ください。

 以上、如何でしょうか?

projecteuler14...または、再帰か繰り返しか

 projecteuler問題14 は、コラッツの問題から、百万以下で最も長い数列をもたらす数値を求めるもの。
 数値を与えて、コラッツの数列を求める関数は、再帰を使うと簡単に定義できます。

(define (collatz n lst)
  (push n lst -1)
  (if (even? n) (collatz (/ n 2) lst)
      (and (odd? n) (> n 1)) (collatz (++ (* 3 n)) lst)
      lst))

 newLISP の ifcond 的な記述ができるので、楽です(笑)。

> (collatz 13)
(13 40 20 10 5 16 8 4 2 1)
> 

 再帰を使うと見通しはいいですが、難点は速度。
 そこで、newLISP には豊富にある繰り返し関数から while を使って、再度定義してみます。

(define (Collatz n)
  (let (lst (list n))
    (while (> n 1)
      (if (even? n) (setq n (/ n 2)) (setq n (++ (* n 3))))
      (push n lst -1))
    lst))

 この程度なら、再帰と比べて見通しも悪くありませんし、早さは 5 ~ 6 倍違います。

> (Collatz 13)
(13 40 20 10 5 16 8 4 2 1)
> 

 これで、コラッツの数列を求める関数はできました。
 後は、百万回繰り返して、最長のリストを求めるだけ。

> [cmd]
(let (res)
  (for (i 1 1000000)
    (let (x (Collatz i)) (if (> (length x) (length res)) (setq res x))))
  res)
[/cmd]
(837799 2513398 1256699 3770098 1885049 5655148 2827574 1413787 4241362 2120681 6362044 
 3181022 1590511 4771534 2385767 7157302 3578651 10735954 5367977 16103932 8051966 
 :
 :
 4025983 12077950 6038975 18116926 9058463 27175390 13587695 40763086 20381543  911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 
 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1)
> 

 最長の数列の長さは 525 。繰り返し関数 for も newLISP では標準です。
 さて、問題の要求しているのは、数列の最初の数値 837799 だけですから、もう少し工夫して、

> [cmd]
(let (res '(0 0))
  (for (i 1 1000000)
    (let (x (length (Collatz i))) (if (> x (res 1)) (setq res (list i x)))))
  (res 0))
[/cmd]
837799
> 

 こんな感じ。

 以上、如何でしょうか?

projecteuler13...または、有効桁数について

 projecteuler問題13は、既にやっていますが、今回は番外編。
 大整数(big integers)が使えるようになった newLISP には簡単な問題ですが、求める答えが和の最初の 10 桁だけなら、大整数を使うまでもありません。
 組込関数 bigint前回bigint の代わりに eval-string を使っています)で大整数にせずとも、float を使って浮動小数点数で計算しても、こと足りるのです。
 何故なら、問題は高々 50 個の加算ですから、10 桁の値を得るには、12 桁の精度を保持しておけば十分です。そして、

> (format "%f" (float 37107287533902102798797998220837590246510135740250L))
"37107287533902104311025740304689820495323647180800.000000"
>

 このように、newLISP の浮動小数点数は 64 ビット長倍精度なので、16 桁くらいまでは精度が保たれます。つまり、問題13 は newLISP の浮動小数点数で十分対応可能です。
 浮動小数点数に変換したリストを入れた data を使って、結果だけ記せば、

> (apply add data)
5.53737623e+051
> (format "%f" (apply add data))
"5537376230390877287140145935443224959721771787878400.000000"
> (0 10 (format "%f" (apply add data)))
"5537376230"
> 

 こんな感じで、答えは合っています。
 まっ、大整数のある newLISP には要らぬことですが(笑)。
 今回の例ではピンと来ないかもしれませんが、技術計算では有効桁数を常に頭に入れて置くことが必須です。newLISP を使っていると往々にして忘れがちですが(汗)。
 ちなみに v.10.5.5 から、大整数の整数演算における引数が二つという制限がなくなり、ますます使いやすくなります。また、浮動小数点数の標準表記も 10 桁から 15 桁になるようです。詳しくは、こちらでどうぞ。

 以上、如何でしょうか?

newLISP マニュアル v.10.5.4 日本語訳公開

 今回のバージョンアップはバグフィックスの他に、関数 t-test の拡充です。
 さて、もう一つ、リリース・ノートに記載がありませんが、廃止される関数から if-not が削除されました。つまり、廃止されないとのこと。何故か、興味のある方はフォーラムでの議論をご一読ください。マニュアルからは外されたままなので、ここで紹介するまでもないのですが、、、

 ということで、マニュアル類の日本語訳をアップしました。
 newLISP の User Manual and Reference と Code Patterns の全訳のリリースです。

newlisp_manual-10504
CodePatterns-10504
こちらからダウンロードしてください。

 目次も含め日本語併記にしてあります。

 いつものように、間違いやおかしな点が有りましたら、こちらの blog までご一報ください。

 以上、如何でしょうか?

projecteuler12...または、返り値を記憶する関数

 projecteuler問題12 は、自然数を加算して得られる三角数において、約数の数が最初に500を超えるものを求めるもの。
 そのために、三角数を newLISP 組込関数 factor で因数分解し、そこから、約数をすべて求めます。
 その際、約数の組み合わせは projecteuler4(続き) で使った binary counting 利用します 。
 ということで、コードは、

(define-macro (memoize mem-func func) 
  (set (sym mem-func mem-func) 
    (letex (f func  c mem-func) 
      (lambda () 
        (or (context c (string (args))) 
            (context c (string (args)) (apply f (args))))))))
(define (make-sublist lst)
  (clean nil? (map (fn(x) (if x $idx)) lst))
)
(memoize combination (lambda (n)
  (let (res)
    (for (x 1 (-- (pow 2 n)))
      (let (lst (bits x true))
        (push (if (< (length lst) n) (append lst (dup nil (- n (length lst)))) lst)
              res -1))
    )
  (map make-sublist res))))
(memoize combination2 (lambda (n)
  (if (= n 0) '()
    (let (res (combination2 (-- n)))
      (push (list n) res -1)
      (dolist (x res (= (x 0) n))
         (push (append x (list n)) res -1))
      res))))
(define (divisors2 num , (res '(1)))
  (let (numbers (factor num))
    (if (= num 1) 1
        numbers
      (let (sublist (combination2 (length numbers)))
        (dolist (x sublist)
          (push (apply * (select numbers x)) res -1))
        (unique res)))))
(let (i 2 sum 1 res nil)
  (until res
    (let (x (divisors2 (++ sum i)))
	   (if (> (length x) 500) (setq res (list i (x -1))) (++ i))))
  res)

 binary counting で作った組み合わせは何度も使いますから、その度に計算するのは無駄。そこで、マクロ memoize の登場です。このマクロは、引数と答えを対で記憶する関数をつくるもので、newLISP の Code Snippets Create memoizing Functions として載っています。
 このマクロを使って関数を作ると、初めての引数には実際に計算し、一度計算した引数には保存してある値を返します。何度も同じ引数を使う時は、大幅に実行時間を短くできます。
 こんな風に、便利で役に立つマクロや関数の例が newLISP のホームページマニュアルコード例に載っているのが newLISP の魅力の一つ。
 さて、このコードを実行すると、

(12375 76576500)
> 

 こんな感じで、出てきます。
 つまり、答えは 12375段目の 76576500

 以上、如何でしょうか?

newLISP マニュアル v.10.5.3 日本語訳公開

 今回のバージョンアップには、バグフィックスの他に、新関数として K 平均法分析に使える kmeans-trainkmeans-query が追加されています。このところ、統計関数の拡充が目覚ましいですね。
 さて、個人的に一番大きな変更は、guiserver.lspversion 1.52 になって、gs:run-shell が二変数関数から三変数関数に変更になったこと。おかげで、newLISP スクリプト用ランチャーを変更しなければなりませんでした。gs:run-shell を使われている方はご注意を。
 ということで、マニュアル類の日本語訳をアップしました。
 newLISP の User Manual and Reference と GUI functions の全訳のリリースです。

newlisp_manual-10503
guiserver_manual-152
こちらからダウンロードしてください。

 目次も含め日本語併記にしてあります。

 いつものように、間違いやおかしな点が有りましたら、こちらの blog までご一報下さい。

 以上、如何でしょうか?

フォロー

新しい投稿をメールで受信しましょう。