[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 18:10 / Filesize : 180 KB / Number-of Response : 714
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Lisp Scheme Part25



1 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:16:33 ]
※ ここはCommon Lisp、SchemeをはじめとするLisp族全般のスレです ※

Part24: ttp://pc11.2ch.net/test/read.cgi/tech/1224939205/
Part23: ttp://pc11.2ch.net/test/read.cgi/tech/1215875388/
Part22: ttp://pc11.2ch.net/test/read.cgi/tech/1211381920/
Part21: ttp://pc11.2ch.net/test/read.cgi/tech/1207300697/
Part20: ttp://pc11.2ch.net/test/read.cgi/tech/1205021786/
Part19: ttp://pc11.2ch.net/test/read.cgi/tech/1200237296/
Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/
Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/
Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part09: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part08: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part07: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part06: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part05: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part04: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part03: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part02: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part01: ttp://piza2.2ch.net/tech/kako/987/987169286.html


375 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:15:14 ]
俺ベテランじゃなくて異端。
viper-modeで、viとEmacs両方のキーバインドを同程度に使う変態。

376 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:19:42 ]
vipperかお?

377 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:22:13 ]
お じゃない。

378 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:27:08 ]
>>375
viper-modeかぁ。15年以上起動したことがない。笑い

379 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:31:02 ]
>>375
   ___l___   /、`二//-‐''"´::l|::l       l! ';!u ';/:::l ', ';::::::l ';:::::i:::::
   ノ l Jヽ   レ/::/ /:イ:\/l:l l::l   u   !. l / ';:::l ', ';:::::l. ';::::l:::::
    ノヌ     レ  /:l l:::::lヽ|l l:l し      !/  ';:l,、-‐、::::l ';::::l::::
    / ヽ、_      /::l l:::::l  l\l      ヽ-'  / ';!-ー 、';::ト、';::::l:::
   ム ヒ       /::::l/l::::lニ‐-、``        / /;;;;;;;;;;;;;ヽ!   i::::l:::
   月 ヒ      /i::/  l::l;;;;;ヽ \             i;;;;;;;;;;;;;;;;;;;l   l::l:::
   ノ l ヽヽノ    /:::l/:l /;;l:!;;;;;;;;;',               ';;;;;;;;;;;;;;;;;ノ    l:l::
      ̄ ̄    /::::;ィ::l. l;;;;!;;;;;;;;;;;l            `‐--‐'´.....:::::::::!l
   __|_ ヽヽ   /イ//l::l ヽ、;;;;;;;ノ....      し   :::::::::::::::::::::ヽ /!リ l
    | ー      /::::l';!::::::::::::::::::::  u               ', i ノ l
    | ヽー     /イ';::l          ’         し u.  i l  l
     |       /';:';:!,.イ   し    入               l l U
     |      /,、-'´/ し      /  ヽ、   u    し ,' ,'  l
     |        /l し     _,.ノ     `フ"       ,' ,'  ,ィ::/:
     |       /::::::ヽ       ヽ    /     し ,' ,' / l::
     |      /::::::::::::`‐、 し      ',  /    u   ,、-'´  l,、-
     |      ``‐-、._::::::::::` ‐ 、     ',/       , -'´`'´ ,-'´
     |      _,、-‐'"´';:::::::::イ:l';:::` ‐ 、._____,、-‐'"´  u /
   | | | |    \ l::/ l::::::/リ ';:::::lリ:::::l';:::l l:l:::::l\  u /
   | | | |

380 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:56:13 ]
>>375
viperモードたまに使うけど、完全に終了させる方法教えて下さい。
viper-go-away しても別のファイル開いたらまたviperになってて、
仕方ないからemacs毎再起動してる。

381 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 02:13:24 ]
>>380
せっかくなので、ソースコードを読んで原因を探ってきました。

viper-go-awayを呼ぶと、viper.elのviper-remove-hooksで、
仕掛けていた各メジャーモードのフックを解除していくのですが、
コードを見ればお分かりの通り、とても素敵なバグがありまして、
find-file-hooksとかは完全スルーです。

なので、自分でコードを修正するか、本家にフィードバックするか、
俺のようにVIPER常駐野郎になるか選んでください。

382 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 04:40:02 ]
と思ったんだけど、追加で調べていったら、
デフォルトのメジャーモードを元に戻さないってバグもあって、
これが本筋っぽい。CVS最新版では修正されてる。
↓を.emacsに追加でひとつ。

(defadvice viper-go-away (after revert-default-major-mode activate)
(setq default-major-mode 'fundamental-mode))

383 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 08:37:29 ]
maximaの細かいbugが未だに放置なのは
common lispの問題なんだろうか
schemeで書かれてるならbugは少なくなるんだろうか



384 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 11:34:14 ]
妄想はそのくらいに

385 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 19:45:52 ]
もともと"Common Lisp"じゃないものをGCLに、そして"Common Lisp"に書き直したからじゃない?
最初から"Common Lisp"で書かれていたら違っていたかも
Maxima使ってないからよくわからないけど

386 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:21:25 ]
質問。この2つに違いってありますか?

(define (f x)
(define g 10)
(+ x g))

(define (g x)
(let ((h 10))
(+ x h)))

387 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:29:49 ]
5.2.2 internal definitionsに変らないと書いてある。

> A <body> containing internal definitions can always be converted
> into acompletely equivalent letrec expression.

388 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:45:33 ]
(define (g x)
 (letrec ((h 10))
  (+ x h)))
となら同じ、が正しいのでは?
letとletrecは違う
この例はたまたまコンビネータ式が束縛されているに過ぎない
(正確には式が束縛されているわけではないけど)

389 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:53:51 ]
質問の意図によるだろうけど
最終的な機械語に落とす段階では同じコードになる

390 名前:388 mailto:sage [2009/02/26(木) 23:57:23 ]
とはいったものの、束縛する式が1つならSchemeレベルではletとletrecは等価ですね

391 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 00:01:31 ]
>>387
ありがとうございます
自分の知らない、
何か違う意味があるんだろうと思って質問したんですが
letrecと同じ意味なんですね

392 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 00:01:49 ]
おっちょこちょいですね。

393 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 00:04:11 ]
>>391
>>386の例ではletで問題ない。



394 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 00:11:24 ]
>>393
了解です。Schemeってシンプルですね。ありがとうございます

395 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 00:20:22 ]
>>387
編集ミスった。
acompletely→a completely

否定のa-に見えてしまう すまん

396 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 10:00:52 ]
さしずめ「うは宇宙のう」

397 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 21:31:01 ]
>>382
遅くなったけどありがとう。これでviperモードと仲良く暮らせそうです。

398 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 08:07:26 ]


399 名前:デフォルトの名無しさん [2009/02/28(土) 09:35:38 ]
399

400 名前:デフォルトの名無しさん [2009/02/28(土) 09:36:03 ]
400

401 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 18:05:35 ]
shibuya.lisp ストリーミング中!
って今ごろ気付いたorz

402 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:49:13 ]
見逃した……
ニコニコ動画辺りに上げてくれないかあ

403 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:33:59 ]
>>402
マイリスト Shibuya.lispテクニカルトーク#2‐ニコニコ動画(ββ)
www.nicovideo.jp/mylist/11305224




404 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:48:54 ]
>>403と投稿者に感謝を

405 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:57:15 ]
>>403
マジでありがとう!!

406 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 01:21:33 ]
他の関数型言語でこの手の集まりをみないのは
学会で代用してるからなのだろうか

407 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 01:33:04 ]
>>406
勉強会ならあるけどな。

408 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 05:19:41 ]
>>403
あー、配信のときとは別テイクで音声がずいぶん聞きやすくなってる!
ありがとうございます。

409 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 10:57:50 ]
>>406
HaskellとかOCamlだと人がそんなにまだ多くないし(Lispに比べれば)、
ゲーム作りましたみたいな大きいネタとか、その筋なら誰でも知ってる大先生とか
そういうのないからねぇ。
さがせば>>407が書いてるみたいに勉強会とかあるからメイリングリストとか
入ってみれば? 今時捨てアドのひとつやふたついくらでも作れるし。

410 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 17:06:35 ]
lispが多いといってもschemerが多いんじゃない?
やはり、川合さんとか、処理系製作者が3人もいるくらいだからね。
common lispは人は少ないよ。Qiやclojure,newLispに至っては壊滅的。

そーいえば、abclがバージョンアップしてたな。

411 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 17:12:46 ]
ircを覗くと、常駐者が

#lisp 250
#haskell 550
#ocaml 50
#scala 50
#clojure 100
#ruby 250

くらいみたいだね。haskellがなんでこんなに多いんだ?

412 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 18:35:37 ]
has略は中ニ設定豊富だからな

413 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:33:36 ]
pc11.2ch.net/test/read.cgi/tech/1234635513/378

自分はLispが全然書けないけど、どんだけ短くなるのか見てみたいです。
どなたお願いします〜



414 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:34:29 ]
>>410
Qiというものを始めて知りましたが、Haskellっぽくて面白そうですね。
ところで皆さんはこういった面白い実装の情報をどこで得てるんでしょうか?
英語のメーリングリストなのかな?とは思ってるんですが・・・

415 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 01:00:31 ]
>>414
それはねぇ。。。こまめに調べてるだけよ。ふふふ。。。lisperがあつまる日本語のチャット
も情報源だよ。
うんQiはHaskellっぽいね。

416 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 01:13:41 ]
ttp://www.zazzle.com/lisp+gifts

これがメリケンだ!?

417 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 02:06:13 ]
>>416
made with secret alien technologyのシャツが無いなんて信じられん

418 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 03:44:57 ]
schemer多いのはシンプルだからなんだろうか

419 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 03:50:50 ]
Qi ECLでは駄目なんだ・・・
高速化って書いてるから期待したのに

420 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 04:18:51 ]
>>413
(use srfi-1)
(define request '((hoge . 1) (fuga . 2) (piyo . 3)))
(filter (lambda (x) (member (car x) '(hoge fuga))) request)
とか

421 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 08:26:08 ]
>>414
Planet LispってRSSあるよ。

422 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 09:50:56 ]
>>421
おおっ、有り難うございます!! さっそくGoogle Readerに追加しました。

423 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 12:07:00 ]
>>420 3行目 srfi-26使って(gaucheならuse不要)
(map (cut assoc <> request) '(hoge fuga))



424 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 12:13:58 ]
ハッシュテーブルに代入したら負けですねわかります

425 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 13:20:03 ]
(defvar *request* (make-hash-table))
(mapc #'(lambda (elem)
(setf (gethash (car elem) *request*) (cdr elem)))
'((hoge . 1) (fuga . 2) (piyo . 3) ...))
(let ((res (make-hash-table)))
(mapc #'(lambda(key)(setf (gethash key res)
(gethash key *request*)))
'(hoge fuga piyo))
res)

とくに簡潔ではないな。

426 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:48:35 ]
schemeで論理の勉強しようと思って
(tflist n)で#tと#fの組み合わせを列挙してくれる関数を書こうとしたんだが
意外と難しい
最初mapで#t → (#t #f) (#t #t)という風に書こうとしたが
これだとflattenが居るし、flattenを再帰で呼び出してみたら
全部平らになってしまって(#t #t #t #t #t #f #t #f #t ...)みたくなっちまった
誰かたすけて

動作イメージ
(tflist 1)
 '(#t #f) or '((#t) (#f))
(tflist 2)
 '((#t #f) (#t #t) (#f #f) (#f #t))
(tflist 3)
 '((#t #t #t) (#t #t #f) (#t #f #t) (#t #f #f) (#f #t #t) (#f #t #f) (#f #f #t) (#f #f #f))

427 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:07:54 ]
(define (tflist n)
 (cond
  ((<= n 0) '())
  ((= n 1) '((#t) (#f)))
  (else
   (let ((l (tflist (- n 1))))
    (define (add-t l) (cons #t l))
    (define (add-f l) (cons #f l))
    (append (map add-t l) (map add-f l))))))

428 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 22:08:27 ]
(define (tflist n)
(if (= n 1)
(list (list #t) (list #f))
(append
(map (lambda (x) (cons #t x)) (tflist (- n 1)))
(map (lambda (x) (cons #f x)) (tflist (- n 1))))))

429 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:19:22 ]
>>427-428
おお、神よ。なるほど、(append (map..)(map..))の形になるのか
もしよろしければもう1個
以下の例で最後の行は動くようになりませうか?
;guile/gaucheでどちらもエラー
(define (mujunritu p) (not (and p (not p))))
(define (haityuritu p) (or p (not p)))
(define (try1 f) (map f '(#t #f)))
(try1 mujunritu)
;これがダメ。try1のfでλx(apply f x)やλx(eval(f x))も試してみたものの
(map try1 '(mujunritu haityuritu))

OCamlでは動作
let mu p = not (p && (not p));;
let hai p = p || (not p);;
let tr f = List.map f [true;false];;
List.map tr [mu;hai];;

430 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:23:52 ]
>>420>>425
サンクス。今の自分じゃ全然理解できないけどorz

431 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:25:52 ]
前きたquote判ってない人かね

432 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:28:26 ]
>>429
`(,mujunritu ,haityuritu)または(list mujunritu haityuritu)
'(mujunritu haityuritu)との違いわかるかな

433 名前:前きたquote判ってない人 mailto:sage [2009/03/03(火) 23:55:18 ]
>>431
別人です。あれからROMしかしてないですよ。



434 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:52:37 ]
>>432
Lisp属の初心者には、このあたりは難しすぎます
調べるのは本当に大変でしたが、何とか見つかりました
ttp://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html
これのことですよね?
 Common Lispでも、関数引数に関数実体も名前も両方使える。
 (略)
 Schemeでは、関数しか受けとらない

確かに、CLでは両方動作することを確認
(defun muj (x) (not (and x (not x))))
(defun hai (y) (or y (not y)))
(defun tr (f) (mapcar #'(lambda (z) (funcall f z)) (list t nil)))
(mapcar #'tr (quote (hai muj)))
(mapcar #'tr (list 'hai 'muj))

schemeの場合
(list mujunritu haityuritu)だと関数実態が返ってくるが
(quote (mujunritu haityuritu))だと名前が返ってくる
schemeにもCLのsymbol-functionみたいな関数があれば
quoteのほうでも動作すると思い調べてみたものの
該当の関数が全然見つからない\(^o^)/
しかし、関数はおいといて、この考えでたぶん、大丈夫ですよね?

435 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 01:20:53 ]
>>434
つ「eval」

436 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 02:00:08 ]
quoteとevalは静的スコープな言語にふさわしくないとつくづく思う

437 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 02:12:51 ]
スコープと評価が?

438 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 02:50:43 ]
schemeのシンボルは文字列に毛の生えた特殊オブジェクトと思えばよろし。
プログラム内でそのシンボルに何が束縛されているかとは基本的に全く関係ない。

439 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 07:25:51 ]
R5RS の eval だと、その時点の環境での評価ができないから symbol-function の代わりにはできないし。

440 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 12:06:53 ]
あくまでも、定義中の名前はシンボルではなくただの変数の入れ物の
名前として使われる。また、プログラムを実行するには変数の位置を
表現できれば名前のような冗長な情報は必要ない。
よって名前は実行前のある時点でアドレスに変換されていると考えるべき。

evalやCLのsymbol-functionみたいな実行時にシンボルからその位置情報へ
変換する仕組みを作るとなると、処理系のインタプリタやコンパイラ相当を
必要時に起動するのと全く事になり、非常に馬鹿げたコストが掛かる。


441 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 12:13:45 ]
>>436
evalはともかくquoteはこの件と関係ない

442 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 13:16:24 ]
>>440
文章として突っ込みどころ多すぎw

内容的にも、後段のsymbol-functionについては、
特殊オペレータのfunctionと勘違いしているとしか思えない。

(defun foo ()
(print 'foo))
(flet ((foo () (print 'foolet)))
(foo)
(funcall (function foo))
(funcall (symbol-function 'foo))))
FOOLET
FOOLET
FOO


443 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 12:49:38 ]
急に流れが止まったから釣りかと思ったが
やっと>>422の言っていることがわかった
symbol-functionってグローバルな関数定義しか参照しないんだな



444 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 13:48:24 ]
schemeにシンボルが無いってことが少し分かってきた
やっぱ Common Lisp 最強だな!

445 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 14:16:03 ]
>>442
(let ((foo #'(lambda () (print 'fooval))))
(flet ((foo () (print 'foolet)))
(foo)
(funcall foo)
(funcall 'foo)
(funcall (function foo))
(funcall (symbol-function 'foo))))
FOOLET
FOOVAL
FOO
FOOLET
FOO

Common Lispは、symbol-valueとsymbol-functionが
シンボルセル内の別スロット。

funcallは>>440の後段のような処理は、
functionに任せて、関数呼び出しに専念する仕様。
funcallの第一引数は関数か、シンボル。
シンボルの場合symbol-functionの結果を使う。

446 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 16:10:34 ]

何が真実なのかさっぱりわからんのでまとめてみたら
カオスになった。つっこみ希望

・evalは静的スコープにはふさわしくない
 動的スコープなら1つしか環境を考えなくて良いためと想像

・schemeのシンボルは文字列に毛の生えた特殊オブジェクト

・呼び出し
 (hoge)はレキシカルな環境での関数呼び出し(関数セル)
 (funcall hoge)はレキシカルな環境での関数呼び出し(値セル)
 (funcall 'hoge)は↓と同様。symbol-functionを使うため
 (funcall (symbol-function 'hoge))はグローバルに定義されたシンボルの関数呼び出し(関数セル)
 (funcall (function hoge))はレキシカルな環境での関数呼び出し(関数セル)
 レキシカル環境で同名の変数がある場合に
 グローバルなシンボルのsymbol-value(値セル)を参照する方法はなさそう

>>442氏の440へのコメント
 ここのあたりが一番わからない
 symbol-functionは(トップレベル変数が動的スコープのため)
 動的スコープを参照出来る
 →functionのようにレキシカルスコープの変数を考慮しなくてよい
 →symbol-functionに関してはevalもそんなにコストかからんぜ、ってこと?

447 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 17:43:08 ]
>>446
442,445はCommon Lispのコードっていうのは分かってる?

> ・evalは静的スコープにはふさわしくない

これは俺も何が言いたいのかさっぱりわからんというか、
はっきり言って間違い。反証はScheme。

448 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 19:15:47 ]
> evalは静的スコープにはふさわしくない
はLisp1.5世代の人の意見なのかな。

449 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 20:28:14 ]
現在のevalはLispらしさを演出するためだけの存在だからな

450 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 21:07:27 ]
evalを使うってのは、速度的にも不利になるし、普通にlispでプログラムを組む人は
避けるところだと思うよ。避けないとすれば腕の悪い人という印象しかないな。少な
くとも他の方法を探すだろう。

451 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:41:58 ]
大抵マクロでおkだからな

452 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:39:34 ]
Qiは
データ
[]
program
()
のカッコをわけたらlispの意味ないとは思わなかったんだろうか


453 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:21:06 ]
>>451
マクロでできることはevalでもできるみたいな言い方だな
第一印象はそんなものだろうけど
それをいつまでも引きずっていていいのかな?



454 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:40:18 ]
451じゃないけど違うの?

455 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:49:10 ]
Lispのマクロ機能はevalで実装されていると思うのだが・・・

456 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:11:36 ]
codepad.org/kiclBi61

457 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 18:36:31 ]
(display (eval (let1 'y 2 `(+ ,x y))))
これで動くよ
何が言いたいのかわからんが


458 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:00:31 ]
言いたいことは
>>443
>symbol-functionってグローバルな関数定義しか参照しないんだな
と同じことがevalにも言えるということ。

evalは外側のローカル変数xの定義を参照できないから
>>457では、事前にxのところを値で置き換えたものをevalに渡している。

459 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:58:27 ]
つーかevalは他のローカル変数のことなんか知らんから。
関数の引数として渡されたコンテクストで評価するしかない。
それを知らせる手段として(current-environment)みたいなものが
処理系にあればやりたいことは実現できるんじゃないか。

460 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 20:13:48 ]
Schemeのevalの話?

Common Lispでは、

(defvar x 1)
(print (eval '(+ x x)))
2
(let ((x 10))
(print (eval '(+ x x))))
20

Schemeのevalは渡された環境への変更に制限もあるよね。
;; R5RSとR6RSで少し違う

461 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:10:14 ]
(let ((x 10))
(print (eval '(+ x x))))

*** - EVAL: variable X has no value



462 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:15:34 ]
>>460が一見意図通り動いてるように見えるのは
最初のdefvarでxをスペシャル変数にしてるから。

schemeで同じことをする場合はfluid-letを使う。

(define x 1)
(display (eval '(+ x x)))
2
(fluid-let ((x 10))
(display (eval '(+ x x))))
20
x
1


463 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 08:01:39 ]
mzschemeで、CGIをPOSTメソッドで使いたいのですが(クライアント側)、うまくいきません。

たとえば、
en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces
と同じことをしたいのですが(これはGETメソッド)、

(let* ((url (string->url "en.wikipedia.org/w/api.php"))
(post (string->bytes/utf-8 "action=query&meta=siteinfo&siprop=namespaces"))
(port (post-pure-port url post))
(xml (read-string 1000 port))
)
xml)

でいけると思ったのですが、エラーメッセージが帰ってきます。
どこがまずいのでしょうか?



464 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 08:57:46 ]
コンビネータパーサを作ったから
せっかくなのでR5RSかR6RS準拠のパーサを書いてみようと思ったんだが
全体のBNFのリストってどこかにまとまってる?
仕様書をざっと見した感じでは、
ばらばらにちょっとずつBNFが載っているように感じるんだが
仕様書ってのはこんな感じのもん?

465 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 09:02:30 ]
Schemeの仕様書はこんな感じのもん。
まぁLispでBNFもくそもないが。

466 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:51:26 ]
Lisp系言語の場合、構文のフォーマルな定義がBNFとはちょっと合わない。書けなくはないけれど。
構文の定義はこんな感じのレイヤになってる。
(1)まずtokenに分解 (R6RSの用語ではlexical syntax)
(2)S式として読み込み (R6RSの用語ではdatum syntax)
(3)S式の中の特定の構造をプログラムの構文として認識 (R6RSの用語ではprogram syntax)
このうち、(2)の出力は既に抽象的な木構造のデータなんで、(3)のレベルの構文定義っていうのは
木構造に対する定義になる。もちろん木構造にマッチする文法を書けばいいんだけど。
プログラムの字面に対するBNFとは違ってくるな。
例えば、"(if x y z)" と"(if . (x . (y . (z))))" は字面では違うけどdatum syntaxとして
読まれた後は全く同じ木構造になる。program syntaxはその木構造だけを見る。



467 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:22:02 ]
コンビネタ・パーザだとレキサも一体で書くスタイルが多い。
>>466で言うと(1)と(2)が一体。
ただ演算子多重定義出来る言語じゃないと、
見た目がシンプルにならない。

468 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:48:06 ]
>>467
それは知ってるんだが、要点はそこじゃなくて(2)と(3)が分離してるってとこ。仕様からして。
>>464 は言語構文のBNF定義がまとまってないってことに違和感を覚えたわけだろ。
(1)-(3)までまとめて書くことはできると思うがきれいになるかな?


469 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:39:11 ]
(3)は、R5RSとR6RSでちょっと違うし、
内部表現的には変える必要ない上に、
read/evalの分離構造ともマッチしているから、
あえて混ぜる必要はないと思う。

>>449
そういえばEuLispにはevalがなかったな。
おもしろい試みだったけどあっさりと廃れたね。
YooTooはまだ更新されているみたいだけど。
R6RSのmoduleも一部影響受けてるね。

470 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 06:01:07 ]
>>463ですが、自己解決しました。
このコードで動きます。


(let* ((url (string->url "en.wikipedia.org/w/api.php"))
(post (string->bytes/utf-8 "action=query&meta=siteinfo&siprop=namespaces&format=xml"))
(header
'("User-Agent: MzScheme"
"Accept: application/xml"
"Accept-Encoding: deflate"
"Accept-Charset: utf-8"
"Content-Type: application/x-www-form-urlencoded"))
(port (post-pure-port url post header))
(xml (read-string 1000 port)))
xml)

すくなくともen.wikipedia.orgのサーバーは、Content-Typeを指定しないとCGIだと認識してくれないようです。

471 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:41:18 ]
>>465-469
ありがとう。こういうもんか
特に466の説明はとてもわかりやすい。
R5RSのほうはBNFついてそうだから
こっちやってみよかな

しかし、PDFって扱いにくいわ
<hoge>って表記をテキストでコピペするとhhogeiになるし
<で検索できんから不便

472 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 05:03:58 ]
ファイルの basenameを取得する関数ってありますか?

"foo.txt" -> "foo"
"foo.bar.txt -> "foo.bar"

といった風に取得したいのですが

自分で書くなら
一文字ずつ後ろから文字比較して . が来るまで探して
その部分を削除。とするんですが

もし既にあるなら書くのも悲しいので
どなたかご存知ありませんか?

473 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 05:37:46 ]
(pregexp-replace "(.*)\\.[^.]+" "foo.bar.txt" "\\1")



474 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 05:49:52 ]
pathname-name
www.lispworks.com/documentation/HyperSpec/Body/f_pn_hos.htm

475 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 06:47:07 ]
>>473-474
レスありがとうございます。

環境を書いていませんでした申し訳ありません。
R5RSで行うにはどうすれば良いでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<180KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef