ベンチャーの起業家に私たちが推薦しているのはデール・カーネギーの「人を動かす」。仕事をする人は必ず読むべき本だ。1960年代より前の版を入手してほしい。 カーネギーの死後、本は委員会に「改訂」され続け、その結果かえって悪くなってしまった。有名な本ですね。読んでいません。個人的に「うさんくせぇー本だな・・・。」と思う本の一つだったので。。
ポール・グレアムがオススメしているとなると読みたくなる不思議。
しかし、一体どうやってそんな古書を・・・。。
ベンチャーの起業家に私たちが推薦しているのはデール・カーネギーの「人を動かす」。仕事をする人は必ず読むべき本だ。1960年代より前の版を入手してほしい。 カーネギーの死後、本は委員会に「改訂」され続け、その結果かえって悪くなってしまった。有名な本ですね。読んでいません。個人的に「うさんくせぇー本だな・・・。」と思う本の一つだったので。。
キー | 実行されるコマンド |
---|---|
C-c i | 編集.選択範囲のフォーマット |
C-h | 編集.一語削除 |
M-; | 編集.選択範囲のコメント |
M-+ | 編集.選択範囲のコメントを解除 |
C-, | ウィンドウ.前のドキュメントウィンドウ |
C-. | ウィンドウ.次のドキュメントウィンドウ |
実験室におけるよき習慣。ヒトは常に間違える。忘れる。混乱する。だから、それをしないよう注意するのではなく、それが起こらないための方法論を考えよ。あるいはミスが起こったとき、その被害が最小限にとどまるような仕組みを考えよ。それが君たちの仕事だ。
私の身体が、あるいは私の精神が不調なのは、何かが不足しているからかもしれない・・・・・・この強迫観念から逃れんがための反動として、私たちは時として、不必要な物質の大量摂取を無自覚に行なってしまうのです。↑を読んで↓を思い出しました。
英語でPlannerはプランする何かです。Conniverはスニーキー(こそこそする、卑劣)なプランナーです。だから、もっとスニーキーなプランナーを何と呼ぼうか。そりゃ、スキーマー(陰謀家、策略家)だ。それで、Schemerとつけたのです。
残念ながら、我々は60年代に設計されたOSを使っていたので、すべてのファイル名は6文字以下でなければなりませんでした。それで、ファイル名SCHEMERは最初の6文字だけに切り捨てられました。
Sussmanと私は、小さなインタプリタを書きました。言語を理解するもっとも簡単な方法はそのインタプリタを書くことです。インタプリタを書くもっともよい言語はLispです。
(require 'cl) (defvar a 100) a ;; 100 (defvar b 200) b ;; 200 (defun a+b () (+ a b)) (a+b) ;; 300 (let ((a 1)(b 2)) (values (a+b)(+ a b))) ;; (3 3) (lexical-let ((a 1)(b 2)) (values (a+b)(+ a b))) ;; (300 3)
(use srfi-15) (define a 100) a ;; 100 (define b 200) b ;; 200 (define (a+b) (+ a b)) (a+b) ;; 300 (let ((a 1)(b 2)) (values (a+b) a b)) ;; 300 ;; 1 ;; 2 (fluid-let ((a 1)(b 2)) (values (a+b) a b)) ;; 3 ;; 1 ;; 2
丸3年放置していましたが、2013/08/07辺りから再開しました。
@valvallow http://bit.ly/9Bvqri
@valvallow まず (use slib)(require 'repl)(require 'syntax-case) とします。 slib 環境内で評価したい式全体を quote して macro:eval 手続きに渡せばよいです。
@valvallow あるいは、 (repl:top-level macro:eval) とすると slib の repl が開始されるのでここに式を入力してもよいです。
;; fluid-let* ;; ;; example ;; (define-values (a b c) ;; (values 1 2 3)) ;; (define (a+b+c) ;; (+ a b c)) ;; (a+b+c) ;; ;; 6 ;; (fluid-let* ((a 100) ;; (b (* a 2)) ;; (c (+ a b))) ;; (a+b+c)) ;; ;; 600
;; fluid-let ;; example (define-values (a b)(values 1 2)) (define (a+b) (+ a b)) (a+b) ;; 3 (fluid-let ((a 100)(b 200)) (a+b)) ;; 300 ;; fluid-let expand image (let ((tempa a)(tempb b)) (dynamic-wind (lambda () (set! a 100)(set! b 200)) (lambda () (a+b)) (lambda () (set! a tempa)(set! b tempb)))) ;; 300 (a+b) ;; 3独習 Scheme 三週間 Teach Yourself Scheme in Fixnum Days に伝統的なマクロを用いた例が載っています。
;; SRFI 15: Syntax for dynamic scoping - http://srfi.schemers.org/srfi-15/srfi-15.html (define-syntax fluid-let (syntax-rules () ((_ ((v1 e1) ...) b1 b2 ...) (fluid-let "temps" () ((v1 e1) ...) b1 b2 ...)) ((_ "temps" (t ...) ((v1 e1) x ...) b1 b2 ...) (let ((temp e1)) (fluid-let "temps" ((temp e1 v1) t ...) (x ...) b1 b2 ...))) ((_ "temps" ((t e v) ...) () b1 b2 ...) (let-syntax ((swap! (syntax-rules () ((swap! a b) (let ((tmp a)) (set! a b) (set! b tmp)))))) (dynamic-wind (lambda () (swap! t v) ...) (lambda () b1 b2 ...) (lambda () (swap! t v) ...))))))
(_ "temps" (t ...) ((v1 e1) x ...) b1 b2 ...) (let ((temp e1)) (fluid-let "temps" ((temp e1 v1) t ...) (x ...) b1 b2 ...)))この部分が素敵ですね!自分はこのテクニック(?)を知らなかったので、今まで以下のように書いていました。。
;; SRFI 15: Syntax for dynamic scoping - http://srfi.schemers.org/srfi-15/srfi-15.html (define-syntax fluid-let (syntax-rules () ((_ ((v1 e1) ...) b1 b2 ...) (fluid-let "temps" () ((v1 e1) ...) b1 b2 ...)) ((_ "temps" (t ...) ((v1 e1) x ...) b1 b2 ...) (let ((temp e1)) (fluid-let "temps" ((temp e1 v1) t ...) (x ...) b1 b2 ...))) ((_ "temps" ((t e v) ...) () b1 b2 ...) (let-syntax ((swap! (syntax-rules () ((swap! a b) (let ((tmp a)) (set! a b) (set! b tmp)))))) (dynamic-wind (lambda () (swap! t v) ...) (lambda () b1 b2 ...) (lambda () (swap! t v) ...))))))
;; Identifier Syntax - http://permalink.gmane.org/gmane.lisp.scheme.reports.wg1/148 (define-syntax fluid-let (syntax-rules () ((fluid-let ("step") bind ((var val) . rest) body ...) (fluid-let ("step") ((var old new val) . bind) rest body ...)) ((fluid-let ("step") ((var old new val) ...) () body ...) (let ((old var) ... (new val) ...) (dynamic-wind (lambda () (set! var new) ...) (lambda () body ...) (lambda () (set! var old) ...)))) ((fluid-let ((var val) ...) body ...) (fluid-let ("step") () ((var val) ...) body ...))))
;; http://www-pu.informatik.uni-tuebingen.de/users/knauel/sw/fffi/easyffi.scm (define-syntax fluid-let (syntax-rules () ((fluid-let ((var1 expr1) (var2 expr2)) body ...) (let ((old-var1 var1) (old-var2 var2)) (set! var1 expr1) (set! var2 expr2) (let ((res ((lambda () body ...)))) (set! var1 old-var1) (set! var2 old-var2) res))) ((fluid-let ((var1 expr1)) body ...) (let ((old-var1 var1)) (set! var1 expr1) (let ((res ((lambda () body ...)))) (set! var1 old-var1) res)))))
;; Control Operations - http://www.scheme.com/tspl4/control.html (define-syntax fluid-let (syntax-rules () [(_ ((x e)) b1 b2 ...) (let ([y e]) (let ([swap (lambda () (let ([t x]) (set! x y) (set! y t)))]) (dynamic-wind swap (lambda () b1 b2 ...) swap)))]))
gauche で (append '() 1) を評価した結果が 1 になるのはなんとなく納得いかないなぁ...これを見て私もまんまと「え、なんでだろう?」と思いました。
shiro: R5RSでそう規定されてます RT: @yujiorama: gauche で (append '() 1) を評価した結果が 1 になるのはなんとなく納得いかないなぁ... http://bit.ly/atJY60で、実際 R5RS を見てみたら、そう書いてありました。そらそうですね。
shiro: appendは正式なリスト同士の演算じゃないんですね。むしろペアに対する演算の一種と考えた方がすっきりする。consやlist*の仲間。 http://bit.ly/9eMywh
@valvallow いや、一貫してるでしょう。 リストの最後 (null) を次のリストに置き換えた形にするものと考えれば。ここまで読んでもピンと来ませんでしたorz
ところで、LISPにはscanlに該当する関数ってあるんでしょうか? > valvallowさん正直わかりません、知りません、すみません。。Haskell 読めませんが、fold っぽいですね。取りあえず確認がてら同じようなものをでっち上げてみます。遅延評価でもなく Gauche 依存ですけれども。以下コード。
@valvallow (use gauche.collection)(define (scanl f x xs)(values-ref (map-accum (^(a acc)(let1 z (f a acc) (values z z))) x xs) 0))なるほど、map-accum ですかー!ちょっと写経。
@valvallow (use srfi-1)(use util.stream)(define(scanl f x xs)(iterator->stream(lambda(n e)(until(null? xs)(n x)(set! x(f x(pop! xs))))(e))))せっかくなので、インデント付けて gist に貼っつけました。