Lisp Scheme Part17at TECH
Lisp Scheme Part17 - 暇つぶし2ch454:デフォルトの名無しさん
07/05/27 16:55:51
>>442
山口百恵のロックンロールウィドウもよろしく

455:デフォルトの名無しさん
07/05/27 22:28:34
Schemeのマクロについてなんですけど、
本体の展開よりも引数の評価を先にするようなトリックってありませんかね?
構造体を定義するマクロを自分でも書いてみようと思ったんですけど、
構造体名structure-nameを与えられてmake-structure-nameという名前の関数を定義する事さえ難しいという現実に直面してしまいました。
グローバル定義だけならevalでお茶を濁す手もあるんですが…

R6RSで導入予定というsyntax-caseもちょっと使ってみたんですが、
まだ標準化されていないせいか、処理系によって違いが結構あるので
今は乗り換えるのを見送ろうと思ってます。

456:デフォルトの名無しさん
07/05/27 22:59:32
よく思うことなんだが、言葉でくどくど説明されてもよくわからん。
簡単なテストケースを書いてくれ

457:デフォルトの名無しさん
07/05/27 23:10:37
;(define-syntax my-define-structure
; (syntax-rules () ((my-define-structure name slot ...)
;                    (define (string->symbol (string-append "make-" (symbol->string name))) (lambda (…
などとして、新しいシンボルを作ってそれを束縛したいのです。
defineは第1引数に式はおろか、準引用すら許しませんから困ってます。
そこで、マクロに展開されてdefineが評価される前に引数がシンボルに展開されれば、と考えました。
これは黒田氏が指摘している問題の一つな気がします。
Shiro氏も
・せめてシンボルの生成くらいはr5rs内で出来て欲しいってのはありますね。
とおっしゃってますし、正攻法ではどうも解決できない気がします。
プリプロセサを書くしかないのでしょうか?

458:デフォルトの名無しさん
07/05/27 23:14:04
混乱してるからクドクドとなるんであって、
簡単にはテストケースを書けないんだろ。

459:デフォルトの名無しさん
07/05/27 23:15:44
defineは第一引数に関数呼び出しはおろか、特別式すら、が正しかったですね

460:デフォルトの名無しさん
07/05/27 23:18:21
>>457
前スレ172みたいなのをコンパイル時にやりたいっつーことだな。
それならやっぱsyntax-case必要だろう。

461:デフォルトの名無しさん
07/05/27 23:29:23
define-macroでできるだろ

462:デフォルトの名無しさん
07/05/27 23:30:37
>>460
うわぁ、古い方の過去ログは読んだのですが、最近のは読んでませんでした。
全く同じですね。
syntax-case使うなら、やっぱりchezでしょうか?
私は主にmzschemeかscheme48かGambit-Cなので、syntax-caseはmzschemeしか使えないし、
chezのものとは少し違うようなので、
ポータビリティを考えたらCL的マクロに逃げるのがベターか、などと考えてます。

あまり関係ありませんが、Gambit-Cのsyntax-rulesを使えるようにするファイルは、syntax-caseが使えないのになんでsyntax-case.scmなのでしょうね。

463:デフォルトの名無しさん
07/05/27 23:31:31
>>461
もちろん、CL的アプローチでは簡単です。
標準仕様の範囲でできるかどうか、という問題です。

464:デフォルトの名無しさん
07/05/27 23:49:36
syntax-caseで書くならこんなカンジか?

(define-syntax define&
(lambda(x)
(syntax-case x ()
((k sym obj)
(with-syntax
((s
(datum->syntax-object (syntax k)
(eval (syntax-object->datum (syntax sym))
(interaction-environment)))))
(syntax (define s obj)))))))

petite chez schemeで試してみたが、こういうテストケースでは動くことを確認した。

(define& (string->symbol (string-append "a" "b")) 1)
ab ;-> 1

結局のところ、今はschemeに足りないところがあるのはそのとおりだと思う。
でもな、完成されたものを使うだけってつまらないと思うわけ。
マクロに関しても色んな提案があってそれぞれ細かい部分で利点も問題点もかかえてて、
それがどう収束していくかってなかなか面白いことじゃないか。
ま、仕事で使うならそうもいってられんのだろうが。

465:デフォルトの名無しさん
07/05/28 00:05:51
仕事で Scheme 使っている人ってここにいるんですかね

466:デフォルトの名無しさん
07/05/28 00:10:20
使ってた。納品物ではなく自家ツール用だけど。最近はCommon Lispのほうが多い。

467:デフォルトの名無しさん
07/05/28 00:11:34
>>464
あなたのプログラムを見て初めて私のsyntax-caseがうまく動かなかった理由が分かりました!
ありがとうございました。

IBMにあるメタプログラミング技法を読んでsyntax-caseを勉強したのですが、
datum->syntax-objectの第1引数の(syntax k)のkはマクロ名にマッチする識別子だったんですね。
syntax-rulesではマクロ名にマッチした識別子は特に使い道がなかったので気がつきませんでした。

468:464 ◆3.JjF77I26
07/05/28 00:26:11
>>467
ここにsrfi-93の日本語訳があるぞ。
URLリンク(www.katch.ne.jp)

> 手続き datum->syntax は引き数として、
> テンプレート識別子 template-id と任意の値 datum のふたつをとる。
>
> (datum->syntax template-id datum)
>
> この手続きは template-id と同一の文脈情報をもつ、
> datum の構文オブジェクト表現を返す。 このとき、
> この構文オブジェクトは datum (訳注: template-id か)が
> 挿入されたのと同時にコードに挿入されたかのようにあつかわれる。

schemeのマクロではただシンボルを置き換えればいいってもんじゃなく、
文脈がからんでくるってこと。
ところでこの文書ではdatum->syntaxってなってるけど、
chez schemeを含むいくつかの系ではdatum->syntax-objectって名前なので注意。

469:デフォルトの名無しさん
07/05/28 01:05:53
>>468
ありがとうございます。
読んでみました。
いろいろ勘違いしているところもありました。
しばらくsyntax-caseの勉強に励もうと思います。

470:デフォルトの名無しさん
07/05/28 13:38:52
462でGambit-Cはsyntax-caseが使えないと書きましたけど
ちゃんと使えますね。
なぜか勘違いしてたみたいです。

471:デフォルトの名無しさん
07/05/28 18:02:01
syntax-caseて処理系に依存するの?

472:デフォルトの名無しさん
07/05/29 00:38:39
syntax-case 面倒臭すぎる
阿呆な質問なんだが scheme にも cl のパッケージの概念導入
できないものなんだろうか…?何か問題でもあるの?

473:デフォルトの名無しさん
07/05/29 00:39:19
srfi を書いて提案しましょう

474:デフォルトの名無しさん
07/05/29 01:05:37
Mona OS が関数型言語 Scheme のシェルを搭載してリリース
URLリンク(slashdot.jp)

475:デフォルトの名無しさん
07/05/29 01:41:35
>>472
schemeでは名前空間を分離しない(?)原則みたいなのがあるとかなんとか言ってなかっったっけ?

476:デフォルトの名無しさん
07/05/29 07:30:57
R6RSに入るんじゃなかった?>パッケージもどき

477:デフォルトの名無しさん
07/05/29 09:42:05
R6RSって出ないんじゃなかったっけ?

478:デフォルトの名無しさん
07/05/29 09:48:50
じゃR7RSで

479:デフォルトの名無しさん
07/05/29 22:22:37
もうR2D2でいいよ。

480:デフォルトの名無しさん
07/05/29 22:29:12
むしろR2D2の方がいいよ

481:デフォルトの名無しさん
07/05/29 22:34:26
100万言語に対応してるんだっけ?

482:デフォルトの名無しさん
07/05/29 22:34:41
schemeから派生した言語って何かありますか?
luaがそれっぽいですが


483:デフォルトの名無しさん
07/05/29 22:56:26
Tとか

484:デフォルトの名無しさん
07/05/29 23:14:15
4/1にc.l.lでr7rsは発布されとったよ。w
URLリンク(groups.google.co.jp)

485:デフォルトの名無しさん
07/05/30 00:29:39
luaはべつにschemeと関係ないよ


486:デフォルトの名無しさん
07/05/30 04:02:59
このスレ住人としてluaの存在ってどうよ
末尾再帰とかゲームで採用されたりとかむかつかね?
しめとくか?

487:デフォルトの名無しさん
07/05/30 04:14:07
schemeも採用すればよかんべ。

488:デフォルトの名無しさん
07/05/30 05:21:59
schemeがシェルに採用されたMonaOSが話題にならない件

489:デフォルトの名無しさん
07/05/30 05:52:53
Scheme流行りの昨今

490:デフォルトの名無しさん
07/05/30 06:00:40
Schemeは黒板専用言語のくせになまいきだな

491:デフォルトの名無しさん
07/05/30 08:54:57
確かにリリカルLispは黒板使ってたなww

492:デフォルトの名無しさん
07/05/30 10:59:04
>>486
むかつく理由が理解できない

493:デフォルトの名無しさん
07/05/30 15:20:35
>>486 は常に敵を探しているタイプ

494:デフォルトの名無しさん
07/05/30 17:36:51
小鳥みたいですね

495:デフォルトの名無しさん
07/05/30 19:36:20
歌が好きだったりしますか?

496:デフォルトの名無しさん
07/05/30 20:33:49
>>495
俺が好きなのは君だけさ

497:デフォルトの名無しさん
07/05/31 11:09:22
read-from-stringは多値を返すのですが、
それぞれを別の変数に入れる方法はありますか?

(read-from-string "459")
459
3

たとえば xとyに 459と3を入れる方法が知りたいです。


498:デフォルトの名無しさん
07/05/31 11:27:35
>>497
multiple-value-bind

499:デフォルトの名無しさん
07/05/31 11:32:57
>>498
ありがとう

失礼ですが、LISP暦は何年でしょうか?


500:デフォルトの名無しさん
07/05/31 11:35:49
multiple-value-bind とか multiple-value-setq とか。

CL-USER> (multiple-value-bind (x y) (read-from-string "459") (list x y))
(459 3)
CL-USER> (multiple-value-setq (x y) (read-from-string "459"))
459
CL-USER> x
459
CL-USER> y
3


501:デフォルトの名無しさん
07/05/31 12:55:18
letでレキシカル変数(LISPでは何?)として定義したhyoを成功のパターンで試すと正しくできますが、
失敗パターンのように要素?を""で囲むと正しく取得できません。
要素を""で囲っても正しく表引きしたいのですがLISPではどうするのでしょうか?

;=== 成功 ===
(let (
(hyo '((A 80) (B 70) (C 100))))
(print (assoc 'A hyo))
"OK"
)

○結果
(A 80)
"OK"

;=== 失敗 ===
(let (
(hyo '(("A" 80) ("B" 70) ("C" 100))))
(print (assoc "A" hyo))
"OUT"
)

×結果
nil
"OUT"

まだよくわかっていないのですが、
""とすると文字列限定される?ということでしょうか?

502:デフォルトの名無しさん
07/05/31 13:13:22
(assoc "A" hyo :test 'equal)

503:デフォルトの名無しさん
07/05/31 13:16:53
assocは普通はequal比較だから同じ文字列なら見つかると思うのだが、
数あるlisp方言の中にはそうでないのもあるのかな?

ちなみにemacs lispで実行してみたらこうなった。

(let (
(hyo '(("A" 80) ("B" 70) ("C" 100))))
(print (assoc "A" hyo))
"OUT"
)

("A" 80)
"OUT"

使ってる処理系が何かを示せばより的確な回答を返せる人がいるかもね。


504:デフォルトの名無しさん
07/05/31 13:16:56
>>502
ありがとう

皆さん、簡単に答えますね。
うらやましいです。


505:デフォルトの名無しさん
07/05/31 13:22:59
'eaualより#'equalの方がいくない?


506:デフォルトの名無しさん
07/05/31 13:41:37
>>503
えー、初心者危険

ちなみに xyzzyです。


507:デフォルトの名無しさん
07/05/31 14:07:30
>>505
なぜ?

508:デフォルトの名無しさん
07/05/31 21:46:17
>>499
エディタのカスタマイズ以外にはあんまり使ってないけど三年ちょっとぐらい

>>503
Common Lisp だと eql だよ

509:デフォルトの名無しさん
07/05/31 22:20:34
eq? アドレスの一致
eqv? 値の一致
equal? 構造の一致

文字列の一致に使えるのって
なんとなくeqv?かと思ったけど違うのね。

eqv?の立ち位置って微妙じゃね?
文字列もアトムと考えればeqv?で良い気がするけど。

510:デフォルトの名無しさん
07/05/31 22:23:46
>>507
わずかに速い気がする

511:デフォルトの名無しさん
07/05/31 22:28:07
>>508
すまん、普段emacs lispとschemeしか使わないのでCommon Lispの
ことがすっかり頭から抜け落ちていた

512:デフォルトの名無しさん
07/05/31 23:32:42
>>509
文字列も場所の列だからベクタと同じ扱いなんじゃなかろうか
string-set! とかあるし

513:デフォルトの名無しさん
07/05/31 23:51:57
あと二次元配列 O(1)でアクセスできるタイプ(効率重視)で
perlで以下のことがLISPではどのように書くのでしょうか?

*定義
$cell['A'][1] = ('国語' 100) <-- Lispのリスト
$cell['A'][2] = ('算数' 20) <-- Lispのリスト
$cell['A'][3] = ('理科' 30) <-- Lispのリスト
$cell['B'][1] = ('家庭科' 90) <-- Lispのリスト

*呼び出し
% print $cell['A'][2];
['算数', 20]


514:デフォルトの名無しさん
07/06/01 00:02:00
>>513
なんか日本語がよくわからないんだが、
多次元配列なら aref に次元の数だけ引数を渡す

(aref #2A((1 2 3) (4 5 6)) 1 2)
=> 6

ところで多次元配列って Lisp では使ったことないんだけど、どういう時使う?

515:デフォルトの名無しさん
07/06/01 00:15:09
>多次元配列って Lisp では使ったことないんだけど、どういう時使う?

まだ構文を覚えている最中で、どういう時に使うかまだでは考えていなかったのです。
LISPでは、多次元配列という考え方でなく別の方法で対処しているということでしょうか?

LISPらしい書き方を学ぶにはどうしたら良いのでしょうか?

私はPerlはかじっておりますので、perlと対比できたらわかりやすいです。

#2Aは何を意味するのでしょうか?2はニ次元Aは????
#3Bにしたらエラーになりました。


516:デフォルトの名無しさん
07/06/01 00:21:36
ちょっとは調べろよwww

517:デフォルトの名無しさん
07/06/01 00:30:49
>>514
ベタな例だけど行列とか

518:デフォルトの名無しさん
07/06/01 01:04:32
ある処理系での多次元配列の例

CL-USER>(make-array '(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1))

#20A((((((((((((((((((((0))))))))))))))))))))




519:デフォルトの名無しさん
07/06/01 01:08:02
20次元配列とかw
まあ、全て2要素にした程度でも凄いサイズになるけどな。
扱えないレベルではないけど。

520:デフォルトの名無しさん
07/06/01 01:13:53
>>501-503
Hyperspecに答えが書いていたね。
URLリンク(www.lisp.org)
のexamplesをみてみて。


521:デフォルトの名無しさん
07/06/01 01:18:38
>>514
一番ありがちなのは lispで行列計算をしている場合。ライフゲームなどの
2次元空間グラフィック。そんなところじゃないのか

522:デフォルトの名無しさん
07/06/01 04:04:33
schemeでany や every は any? every?じゃないんだな。

523:デフォルトの名無しさん
07/06/01 05:33:21
(any hoge? ...) という使い方になるわけだから俺には違和感ないな。

524:デフォルトの名無しさん
07/06/01 05:38:40
anyはブール値を返すわけじゃないからじゃね?

525:デフォルトの名無しさん
07/06/01 06:49:57
for-all、existsとの違いがイマイチ

526:デフォルトの名無しさん
07/06/02 20:21:56
このスレのレベルが急速に低下してるな……

527:デフォルトの名無しさん
07/06/02 20:25:51
...and justice for all

528:デフォルトの名無しさん
07/06/02 22:25:07
関数型系の複数のスレに、全く同じレス付けてる >>526 って何なの?

529:デフォルトの名無しさん
07/06/02 22:46:56
>>527
'((justice is lost) (justice is raped) (justice is gone))

530:デフォルトの名無しさん
07/06/02 23:21:29
>>528
休みの日にデパートの屋上から路上を眺めるのが趣味の人なんじゃないの

531:デフォルトの名無しさん
07/06/02 23:34:40
今の時代なら、休みの日にgoogleで海岸とかプールを拡大して
凝視してる人だろ

532:デフォルトの名無しさん
07/06/02 23:48:09
LIVE映像じゃないと、ちょっと行為としてしっくりこない気がする。

533:デフォルトの名無しさん
07/06/02 23:51:27
では、ライブカメラを漁ってる人

534:デフォルトの名無しさん
07/06/03 16:55:16
Lispは型推論を持たない

535:デフォルトの名無しさん
07/06/03 16:55:45
唐突にどうしたんだぜ?

536:デフォルトの名無しさん
07/06/03 17:16:00
ヒント:日曜日

537:デフォルトの名無しさん
07/06/03 17:37:08
>>536
正解!

538:デフォルトの名無しさん
07/06/03 18:34:02
LISPに ne 等しくないという等号はありますか?


539:デフォルトの名無しさん
07/06/03 18:44:09
(defun ne (x y) (not (eq x y)))

540:デフォルトの名無しさん
07/06/03 19:04:01

「等しくないという等号」にすげぇ違和感


541:デフォルトの名無しさん
07/06/03 19:09:59
そうですね

はい次。

542:デフォルトの名無しさん
07/06/03 23:27:36

pushすると
("C" "B" "A")となりますが
例えば、

(def test(x lst)
...
)

(setq lst '())
(test "A" lst)
(test "B" lst)
(test "C" lst)
(print lst)
で("A" "B" "C")とするには、どのようにtest関数を作ればよいのでしょうか?
pushした後 reverseせず、純粋に("A" "B"..というリストを作りたいです。



543:デフォルトの名無しさん
07/06/03 23:35:57
>pushすると
>("C" "B" "A")となりますが

なりませんでした

はい次。

544:デフォルトの名無しさん
07/06/03 23:40:12
>>542
何故そんなに push を嫌うのか分からん

545:デフォルトの名無しさん
07/06/03 23:45:09
rplacdでマクロ作ればいいんじゃね

546:デフォルトの名無しさん
07/06/04 00:17:17
push して nreverse が一番効率いいと思うがな

547:デフォルトの名無しさん
07/06/04 00:42:34
誰一人>>543の仕切りに従ってない点について。

548:デフォルトの名無しさん
07/06/04 00:49:08
そりゃー2chだもの

549:デフォルトの名無しさん
07/06/04 00:54:11
拝啓547様

正しいマナーが根付くには時間がかかるものです。
悪癖は容易には正されません。
円滑なスレ進行のため今後も努力する所存です。

543

550:デフォルトの名無しさん
07/06/04 00:55:35
うまく人を逆撫でできる人は自分の話題に持ち込めるけど、
単なる阿呆、とだけ思われてオシマイだと、うち捨てられて終わりなんだよね。

551:デフォルトの名無しさん
07/06/04 03:29:47
>>542
君が欲しいのはこんな感じのものでは?
(defmacro test (x lst) `(setq ,lst (append ,lst (list ,x))))

でも>>546の言うとおり、pushしてnreverseのほうがたぶん速いよ。

552:デフォルトの名無しさん
07/06/04 04:08:00
多分 queue が使いたいんじゃないかなーと思った。

553:デフォルトの名無しさん
07/06/04 13:51:23
Common Lispらしいという意味ではfill pointer付きarrayという手もあるな。使ったことないけど。

554:デフォルトの名無しさん
07/06/04 21:13:09
>>553
コンシングを減らすために使ってみたことあるよ。
おれがヘボなせいかあんま高速化しなかったけどorz

cl-user(5): (setq vec (make-array 10 :fill-pointer 0 :adjustable t))
#()
cl-user(6): (vector-push "a" vec)
0
cl-user(7): (vector-push "b" vec)
1
cl-user(8): (vector-push "c" vec)
2
cl-user(9): vec
#("a" "b" "c")
cl-user(10): (concatenate 'list vec)
("a" "b" "c")


555:デフォルトの名無しさん
07/06/05 00:50:01
>>542
それはマクロでやると簡単。

(defmacro test (x lst)
`(setf ,lst (append ,lst (list ,x))))


556:デフォルトの名無しさん
07/06/05 01:02:27
既にでてたorz.

557:デフォルトの名無しさん
07/06/05 03:19:49
nreverseの方が早いっていうのは
appendが新しいリストをconsセル一つ一つつなげて返すのに対して
nreverseは元のリストを破壊操作で処理するからって言うことで正しいですか?


558:デフォルトの名無しさん
07/06/05 07:17:24
最後に付け加えるのが時間かかるってことじゃない?
nreverse なら cons セルのつなげかえをするだけなので O(n) なのに対して、
リストの最後に付け加えていくのはリストが長くなるほど
たどる量が増えて O(n^2) になる、っていうことだと思う。

559:デフォルトの名無しさん
07/06/05 14:06:30
FreeBSD6.2RELEASEでGauche0.8.7をつかっています。
(inc (dec inc))と(1 2 3)を入力として与えると
(2 (1 4))を返すような関数が欲しいんですけど、
なんか既にあるような気がします。
こ存じないですか?


560:デフォルトの名無しさん
07/06/05 14:16:59
(define (foo x y) '(2 (1 4)))


561:デフォルトの名無しさん
07/06/05 15:58:34
そんな変な関数ある気がしないw

562:559
07/06/05 16:20:06
そうですか…
リストを構造体に見立てて、
別の構造体に変換するような操作は結構あるような気がしたんですが…
だとすると俺のやりかたが間違っているんだろうか。
ちょっと違う形になりましたけど、とりあえず書いたもんさらしてみます。

(define (general-apply syn args)
(eval `(,syn ,@args) (interaction-environment)))
(define (data-convert index record convert-rule)
(general-apply 'let (list (zip index record) convert-rule)) )
で、
(data-convert '(a b c) '(1 2 3) '(list (inc a) (list (dec b) (inc c))))
みたいな使い方をします。


563:デフォルトの名無しさん
07/06/05 16:27:00
いまいちよくわからないんだけどutil.matchみたいなことを考えているのかな。
URLリンク(practical-scheme.net)


564:559
07/06/05 17:31:16
>563
おお、なんかこれでよさそうです。
ありがとうございました。


565:デフォルトの名無しさん
07/06/08 16:24:42
wilikiのスタイルシートってcgiと同じディレクトリにおけばいいの?
全然うごいてくれない


566:デフォルトの名無しさん
07/06/08 17:15:18
吐かれたHTML読んでみたら?

567:デフォルトの名無しさん
07/06/08 20:38:12
>>565
キーワード引数で :style-sheet のとこにスタイルシート名を指定すること。

568:565
07/06/10 14:51:28
結局解決できませんでした
しかたないのでpukiwikiをインストールします

569:デフォルトの名無しさん
07/06/10 15:02:04
うんそれがいいよ

570:デフォルトの名無しさん
07/06/12 00:38:23

(if (解決-p 565)
 (install wiliki)
 (install pukiwiki))

残念。。

571:デフォルトの名無しさん
07/06/12 00:56:25
pukiwikiをschemeで書き直せばいいじゃん

572:デフォルトの名無しさん
07/06/12 00:59:38
ウッキ、ウッキ、ウィッキー

573:デフォルトの名無しさん
07/06/12 01:01:44
わかったよブービー(´・ω・`)

574:デフォルトの名無しさん
07/06/12 01:03:49
ウィッキーさん元気してるかね?
なつかしすなー

575:デフォルトの名無しさん
07/06/12 04:45:52
ウィッキー→みのもんた
だと思ってた時期が(ry

576:デフォルトの名無しさん
07/06/12 21:31:35
ウィッキーは落語家のえーっと鶴なんとか

577:デフォルトの名無しさん
07/06/13 21:15:05
(define port (open-input-file "c:\\tmp\\data.txt")
(define line (read-line port))
(append lst (line))

テキストファイルから、一行ずつ読み込んでリストに加えて行くという処理を書いてるのですが、
3行目の(line)でエラーになります。
こういう場合、どう書けばいいんでしょう?


578:デフォルトの名無しさん
07/06/13 21:17:35
どんなエラーとか書こうぜ

579:デフォルトの名無しさん
07/06/13 21:32:15
>>578
> gosh: "error": invalid application: ("aaa")

こんな感じです。
"aaa"は、テキストファイルから読み込んだ内容になってます。

580:デフォルトの名無しさん
07/06/13 21:50:46
(append lst line)

581:デフォルトの名無しさん
07/06/13 21:56:13
質問です。
リテラルを破壊的に変更してはいけないといわれますが、次のような場合もでしょうか?

(do ((i 10 (- i 1))
(r '() (cons i r)))
((zero? i) (reverse! r)))

(reverse r) と書くべきなんでしょうか?

582:デフォルトの名無しさん
07/06/13 21:58:39
>>581
その例ならリテラルを破壊的に変更はしないと思う

583:デフォルトの名無しさん
07/06/13 22:08:26
>>582
じゃあ、次の場合はどうでしょうか。
リテラルを破壊的に変更してしまっているので、(reverse r) と書くべきでしょうか?

(do ((i 0 (- i 1))
(r '() (cons i r)))
((zero? i) (reverse! r)))

584:デフォルトの名無しさん
07/06/13 22:12:33
wiliki の質問スレはどこですか?

585:デフォルトの名無しさん
07/06/13 22:13:31
>>583
空リストはそもそも破壊できるような物ではないので大丈夫

586:デフォルトの名無しさん
07/06/13 22:16:52
>>585
じゃあ、空リストでない次の場合には破壊的に変更しているので、
(reverse r) と書くべきですね?

(let ((lst '(a b c)))
(do ((i 0 (- i 1))
(r lst (cons i r)))
((zero? i) (reverse! r))))

587:デフォルトの名無しさん
07/06/13 22:17:53
>>586
そう。こういう場合は reverse! は厳禁。

588:デフォルトの名無しさん
07/06/13 22:23:03
>>587
なるほど、やっと解ったような気がします。どうもありがとうございました。

589:デフォルトの名無しさん
07/06/16 11:57:56
lisp厨、必死だなw

590:デフォルトの名無しさん
07/06/16 17:34:58
ここはlisp厨のスレだが何か?

591:デフォルトの名無しさん
07/06/16 18:47:59
チュウチュウうるさいなぁ、おまえらそんなにチュウが好きならスペースチャンネル5でもやってろ!


592:デフォルトの名無しさん
07/06/16 20:57:21
Squeakもあるぜよ

593:デフォルトの名無しさん
07/06/16 22:15:21
本谷有希子さんとチュウしたい
スレリンク(book板)

594:デフォルトの名無しさん
07/06/18 14:29:24
FreeBSD6.2RELEASEでGauche0.8.10[utf-8]を使っています。
字句解析を使用と思い、以下の様なコードを書きました。
(define (lex-analyze inpx)
;; inpx: input port
(define (op? inpx)
(define op-char #\()
(if (char=? op-char (peek-char inpx))
(begin
(read-char inpx)
(cons 'op (list op-char)) )
#f ))

(define (cp? inpx)
(define cp-char #\))
(if (char=? #\) (peek-char inpx))
(begin
(read-char inpx)
(cons 'cp (list cp-char)) )
#f ))



595:594
07/06/18 14:31:06
(define (ws? inpx)
(if (char-whitespace? (peek-char inpx))
(let loop ((r (list (read-char inpx)))
(nc (peek-char inpx)) )
(if (char-whitespace? nc)
(loop (cons (read-char inpx) r) nc)
(cons 'ws (reverse r)) ))
#f ))

(define (wd? inpx)
(define (allowed-char? x) (not (char-whitespace? x)))
(if (allowed-char? (peek-char inpx))
(let loop ((r (list (read-char inpx)))
(nc (peek-char inpx)) )
(if (allowed-char? nc)
(loop (cons (read-char inpx) r) nc)
(cons 'wd (reverse r)) ))
#f ))

(define tokens (list op? cp? ws? wd?))

(define (f inpx)
(let loop ((t tokens))
(cond ((null? t) #f)
(((car t) inpx) => values)
(else (loop (cdr t))) )))



596:594
07/06/18 14:32:01
(let loop ((r '()))
(if (eof-object? (peek-char inpx)) (reverse r)
(loop (cons (f inpx) r)) ))
)

ここで、
echo '(+ 1 2)' > /tmp/hogeして作ったファイルを、
(define inp (open-input-file "/tmp/hoge"))として読み込ませて、
(lex-analyze inp)としたのですが、結果が返ってきません。
どうやら、2を読み込むところで時間がかかっている様なのですが、
どうしたらよいのでしょうか。



597:デフォルトの名無しさん
07/06/18 16:27:31
答えじゃなくて悪いんだけど、
(let loop ((r (list (read-char))) (nc (peek-char)))
letの束縛規則により、read-charとpeek-charの
どっちの副作用が先に適用されるのか不明ですよ。
Cの関数呼び出し時の引数でgetcとungetcを同時にしてると考えてください。

598:デフォルトの名無しさん
07/06/18 16:28:16
とりあえずそのallowed-charでは ) も #t にしてしまう。


599:デフォルトの名無しさん
07/06/18 16:39:34
(loop (cons (read-char) r) nc)
ncが更新されてないよ。
peek-charを使わずに書き直した方が良いのでは。

600:デフォルトの名無しさん
07/06/18 16:51:06
>>599
let loopの内側に(let ((nc peek-char)) ... ) でいいでしょ

それよりファイル末尾がwhitespaceの列だったりするとws?がeof読もうとして死ぬ

601:デフォルトの名無しさん
07/06/18 17:18:39
そういえばchar=?で#<eof-object>を比較して大丈夫なの?

602:デフォルトの名無しさん
07/06/18 17:39:44
wd? は whitespace でしか終了しないでしょ。
ということは、 "2)" まで wd? で読み取って eof になっているが、 eof に対処するコードが wd? にないのでここで終了できなくなっている。これが原因でしょう。
仮に (+ 1 2 ) のように2と閉じカッコのあいだに空白を入れてみてごらん。それなら終わるから。

あと Gauche を使ってるなら text.parse とか便利なライブラリがあるから、そういうのを使った方がすっきり書けるよ。
ws? みたいなやつは skip-while を使えば一発だし。


603:594
07/06/18 18:32:44
>597
それは気づきませんでした。
ありがとうございます。

>598
すいません、怠けたかっただけなんです…
でもそのせいみたいですね。

>602
ありがとうございます。
(+ 1 2 )にしてもエラーで止まってしまいます。
でもそこら辺にもんだいがありそうですね。
もう少しやってみます。

それからこれは自分でパーサを書いてみよう、という試みなので、
ライブラリを使うのは無しです。
でも参考にしてみようと思います。


みなさんありがとうございました。


604:デフォルトの名無しさん
07/06/18 20:08:26
文字はリストやストリームとしていつでも取り出せるように蓄えとくと
バックトラックとか副作用気にせずできて便利っすよ。
named-let活用したいみたいだしCPS勉強すると良いでしょう。
例えばトークン抽出時や#f返してる所は末尾コンテキストだから、
そのまま他の判定処理にたらい回しして継続できるし。
慣れればread-charとかのI/O操作は違うレイヤーとして管理できるよ。

605:デフォルトの名無しさん
07/06/18 21:37:01
今日初めてreaderマクロなるものとCL-YACCと言う物を体験しました。

惚れた、もっと昔に食わず嫌いしないでやっておけばよかった。
ちょいとのめり込み中。





606:デフォルトの名無しさん
07/06/20 20:12:56
リストから、n番目の要素を削除して、その削除した要素を返す関数を書きました。
まず下のような感じで書いたのですが、これだと、nが0の場合にエラーになります。

(define (remove-at! ls n)
  (let loop((prev '()) (rest ls) (count n))
    (if (zero? count)
      (begin
        (set-cdr! prev (cdr rest))
        (car rest))
      (loop rest (cdr rest) (- count 1)))))

それで、nが0の場合は別に処理を入れてみたのですが、破壊的操作で、リストの先頭を削除するのがどうしてもわかりません。
どう書けばいいでしょうか?

(define (remove-at! ls n)
 (cond
   ((null? ls) '())
   ((zero? n)
     (let
       ((tmp (car ls)))
       (set-cdr! ls (cdr ls)) ;; ここがダメ
       tmp))
   (else
     (let loop((prev '()) (rest ls) (count n))
       (if (zero? count)
         (begin
           (set-cdr! prev (cdr rest))
           (car rest))
         (loop rest (cdr rest) (- count 1)))))))


607:デフォルトの名無しさん
07/06/20 20:41:55
>>606
> 破壊的操作で、リストの先頭を削除するのがどうしてもわかりません。

そういうことは原理的にできない。(理由は考えてみるべし)
append! で第一引数が () の場合なども同様で、結果は明示的に返す必要がある。

608:デフォルトの名無しさん
07/06/20 21:24:07

(define (remove-at! ls n)
(if (null? ls)
(error "list too short")
(if (zero? n)
((lambda (tmp)
(set-car! ls (cadr ls))
(set-cdr! ls (cddr ls))
tmp)
(car ls))
(remove-at! (cdr ls) (- n 1)))))


609:デフォルトの名無しさん
07/06/20 21:42:44
>>607
>(理由は考えてみるべし) 

Cだったら、下のようなコードで、仮引数のほうを書き換えて、実引数が変化しないって悩んでるようなもんですかね?

struct cell {
  struct cell* next;
  const char *symbol;
};

const char* remove_at(struct cell* p, int n)
{
  p = ・・・・
・・・
}





610:デフォルトの名無しさん
07/06/20 22:04:41
(define (remove-at! ls n)
(cond ((null? ls) '())
((zero? n)
((lambda (tmp)
(set-car! ls (cadr ls))
(set-cdr! ls (cddr ls))
tmp)
(car ls)))
((= 1 n)
(if (null? (cdr ls))
'()
(if (null? (cddr ls))
((lambda (tmp)
(set-cdr! ls '())
tmp)
(cadr ls))
((lambda (a b c)
(set-car! b (car c))
(set-cdr! b (cdr c))
a)
(cadr ls)
(cdr ls)
(cddr ls)))))
(else (remove-at! (cdr ls) (- n 1)))))


611:デフォルトの名無しさん
07/06/20 22:42:56
>>608
>>610

サンキューです。

      ((lambda (tmp) 
      (set-car! ls (cadr ls)) 
      (set-cdr! ls (cddr ls)) 
      tmp) 
      (car ls)) 

で、書き換えできるみたいですね。
勉強になります。

612:デフォルトの名無しさん
07/06/20 23:22:49
でも結局
(remove-at! 0 '(a))
とすると破綻する。

変数の参照先をconsセルから全く別のものに置き換える操作って無いよね?

613:デフォルトの名無しさん
07/06/20 23:35:42
話を単純にして、「リストの先頭を削除」を考えれ。

(set! リスト (cdr リスト))
これを関数化するのは不可能というのを理解してるかどうか。

(define (リスト削除 リスト) (set! リスト (cdr リスト)) リスト)

(define リスト '(a b c))
(リスト削除 リスト) => (b c)
リスト => (a b c)

(set! リスト (リスト削除 リスト))
リスト => (b c)

答え
(define-macro (リスト削除 リスト) `(let ((リスト ,リスト)) (set! リスト (cdr リスト)) リスト))
(リスト削除 リスト)
リスト => (b c)



614:デフォルトの名無しさん
07/06/20 23:37:16
ごめ、間違えた
まあ判るよね

615:デフォルトの名無しさん
07/06/21 17:54:16
CLにはsetってのがありますが、
なんでschemeではないのでしょうか。



616:デフォルトの名無しさん
07/06/21 18:16:03
思想が違うから

617:デフォルトの名無しさん
07/06/21 18:35:45
最初期のSchemeにはあったが
危険だし行儀が悪いってことで廃止された

618:615
07/06/21 19:04:54
>617
危険だというのは分かりますが、
行儀が悪いというのはどういうことですか?

619:デフォルトの名無しさん
07/06/21 19:28:08
プログラミングスタイルとしてよろしくないってこと

620:デフォルトの名無しさん
07/06/21 19:29:11
はあああああ?????

621:デフォルトの名無しさん
07/06/21 20:08:13
知能障害発生

622:デフォルトの名無しさん
07/06/21 20:35:34
(gc)


623:デフォルトの名無しさん
07/06/23 10:46:01
LISP 1.5 Programers manual(MIT press)
というものが発掘された。

624:デフォルトの名無しさん
07/06/23 14:22:00
下の例で、1 は自然に理解できるんですが、次の 2 がなぜそうなるのか…

;; 1
(define a '(big brown dog))
(define b (cons 'the a))
a ;=>(big brown dog)
b ;=>(the big brown dog)

(eq? a (cdr b)) ;=>#t

(set-cdr! a '(black cat))
(eq? a (cdr b)) ;=>#t

;; 2
(define a '(big brown dog))
(define b (cons 'small (cdr a)))
a ;=>(big brown dog)
b ;=>(small brown dog)

(eq? (cdr a) (cdr b)) ;=>#t

(set-cdr! a '(black cat))
(eq? (cdr a) (cdr b)) ;=>#f

(cdr a) ;=>(black cat)
(cdr b) ;=>(brown dog)

同一のオブジェクトを指しているのに、なぜ (cdr b) は元のままなんでしょうか?


625:デフォルトの名無しさん
07/06/23 15:01:42
図に書いてみればいいんでない

626:デフォルトの名無しさん
07/06/23 15:10:25
> 同一のオブジェクトを指しているのに
指していません。


627:デフォルトの名無しさん
07/06/23 16:33:26
>>625
> 図に書いてみればいいんでない

図を書いてみてやっとわかりました!

>>626
> > 同一のオブジェクトを指しているのに
> 指していません。

set-cdr! する前の (cdr a) と (cdr b) は同一のオブジェクトを指しているけど、
set-cdr! のところで、新しいコンスセルが作られて、a の cdr がそのコンスセルを
指すようになっただけなんですね!

1 のケースもやっぱりわかってなくて、
eq? で比較して同じなんだから当然だよなとか思ってただけでした。

今度からはちゃんと図を書いて考えることにします。ヒントありがとうございました!


628:デフォルトの名無しさん
07/06/23 18:32:46
1つの定数を使いまわすならeq?は真だけど
2つの同値の定数が同アドレスになるかどうかは処理系依存


629:デフォルトの名無しさん
07/06/24 21:51:05
lispとschemeって何が違うの?
普段はclispをcygwinとfinkで使ってるんだけど
URLリンク(itpro.nikkeibp.co.jp)
ここ見てたら
「私のお勧めは,Lispの方言の一つであるSchemeの処理系,Gaucheです」
なんて書いてあるからすこし気になって・・・


630:デフォルトの名無しさん
07/06/24 23:05:32
方言つーことはSchemeはLispの一種であるわけだ。
単にLispっていうとCommonLispのことを指したりする場合が多いけど、
それっぽい系統の言語は全部Lispだ。
だけど、CommonLisp使いはSchemeをLispと呼びたくない人もいたりして、
それぞれの主張がある。
その辺は空気を読んで折り合いを付けていかねばならんところ。

CommonLispとSchemeの何が違うかって言う話を一言で言えば規格が違う。
どのように思想が違うかってのはウェブ上に色々文章があるから、
それを見てから疑問に思ったことを質問してくれ。

631:デフォルトの名無しさん
07/06/24 23:14:19
スペイン語とイタリア語みたいなちがいだ。
使ってるやつらにとっては大きな違いで、お互い意味通じねえよ!
っていってるが、日本から見たらどっちも同じようなもん。




632:デフォルトの名無しさん
07/06/24 23:42:54
>>631
ポルトガル語とスペイン語のほうが分かりやすいかも。

633:デフォルトの名無しさん
07/06/24 23:53:37
>>629
人の勧めにいちいち流されない人間になるのが先決では?

634:デフォルトの名無しさん
07/06/25 00:03:01
>629
JavaとD言語くらい違う
ダートマス大学のBASICとMS-BASICぐらい違う

元々同じ系統で似たような書き方をするが
同じコードが通ることはまず無いって感じかな
同じことするにも違う書き方をする場合が多い

635:デフォルトの名無しさん
07/06/25 00:31:53
>>629
今のSchemeと少し違うけどこれ読むといいよ
Scheme: A Interpreter for Extended Lambda Calculus
URLリンク(www.brics.dk)

636:デフォルトの名無しさん
07/06/25 01:23:43
>>633
関係なくね?

637:デフォルトの名無しさん
07/06/25 23:54:24
>>635 ほえーこれがCSの論文かー。本文にコードが書きまくってあって驚いた。 普段自然科学の論文しか読まないもので。いきなり本文に、 Let us now compute (fact 3).とかあって笑た。

638:デフォルトの名無しさん
07/06/26 02:14:02
>618
関数型は基本的に変数というものが希薄。理由は、関数型のスタートは
チューリングマシンや階差機関、ノイマン型を元とした手続き型言語と基本的
な原理が違う。同様にloopもunsafe。考え方を改めないとだめ。

639:デフォルトの名無しさん
07/06/26 06:37:45
>>638 的外れ。 set! なら関数型で安全なのか?


640:デフォルトの名無しさん
07/06/26 08:26:45
日本語でおk

641:デフォルトの名無しさん
07/06/26 10:02:32
コンストラクタだけでコードを書くことをイメージするんだ

642:デフォルトの名無しさん
07/06/26 10:09:17
関数型が……っていうんなら
!が付く関数がある時点でアウトだろ。

643:デフォルトの名無しさん
07/06/26 12:34:47
まぁ安全かどうかを突き詰めるなら Haskell でもやってなさいってこった

644:デフォルトの名無しさん
07/06/26 22:41:14
TMとノイマン型とを同列に並べるのはどうも違和感ががが

645:デフォルトの名無しさん
07/06/27 01:39:47
>644
関数型と比較した場合の逐次命令実行型という意味では同じと思った

>まぁ安全かどうかを突き詰めるなら Haskell でもやってなさいってこった
それを言ったらC++でC風なコードを書いているのといっそで、関数型言語を
使う意味ないよ


646:デフォルトの名無しさん
07/06/27 02:10:10
関数型言語なんて使ってないし

647:デフォルトの名無しさん
07/06/27 02:12:23
はいはい

648:デフォルトの名無しさん
07/06/27 02:24:12
関数型信者うざ

649:デフォルトの名無しさん
07/06/27 02:29:49
ごめん...

650:デフォルトの名無しさん
07/06/27 20:47:13
リクナビ

651:デフォルトの名無しさん
07/06/28 06:53:59
おっ、common厨は消えたか

652:デフォルトの名無しさん
07/06/28 12:20:31
はいはい

653:デフォルトの名無しさん
07/06/28 12:44:18
common厨ですけど、今忙しいのでちょっと待っててね

654:デフォルトの名無しさん
07/06/28 16:28:20
うん。待ってるから……
ずっと待ってるから、必ず来てね。
約束……だよ?

655:デフォルトの名無しさん
07/06/28 17:48:58
カット!やりなおし

656:デフォルトの名無しさん
07/06/28 19:16:10
カットってPrologのあれ?
確か ! だったっけ

657:デフォルトの名無しさん
07/06/28 19:16:46
誰が上手い事を言えと

658:デフォルトの名無しさん
07/06/28 21:55:50
cutといえばコンビネータだね

659:デフォルトの名無しさん
07/06/30 12:57:27
質問です。
(defun color (fruit)
(case fruit
(apple 'red)
((banana lemon) 'yellow)
(peach 'pink)
(otherwise "I don't know")))
という果物の名前を引数にとって、色の名前を返す関数colorで
何もマッチしない時の処理が、
(otherwise "I don't know")))
なんですが、これを
(t "I don't know")))にしてもOKだと説明してあって、
どうしてなのかな?と自分なりに考えたんですが、
LispではNIL以外は何でも真だからマッチしない物を一緒くたにまとめた物を
tとして扱うのかな、と思ったんです。
実際のところ、なんでtなんですか?
otherwiseなら納得できるのですが。

660:デフォルトの名無しさん
07/06/30 15:18:08
condにおいて条件が常に真という意味。if (1) { ~ }と同じ。
elseに相当する物がなかった時代の名残り。
caseでも使われるのはcondと同じ構文だから。
長い間LISP使いにとっての常識だった。
otherwiseみたいな長いシンボルはCommonLisp特有。

661:デフォルトの名無しさん
07/06/30 15:28:28
伝統的には t だけど otherwise のほうが判りやすいという意見もあって追加された。
car と first みたいなもんで、好きな方を使えば良い。

662:デフォルトの名無しさん
07/07/01 18:22:31
URLリンク(blog.so-net.ne.jp)

PAIP 読んだ事無いけど、λの発祥が ^ だとは知らんかった。

(^ (x) (* x x))

何気に良いんじゃないだろうか...

663:デフォルトの名無しさん
07/07/01 18:32:50
今や (λ (x) (* x x)) で良いんじゃないかという気もする

664:デフォルトの名無しさん
07/07/01 18:59:50
あちらの人はどうやって入力するんだ?

665:デフォルトの名無しさん
07/07/01 19:03:06
ギリシャ人ならへっちゃらだな(本当か?)

666:デフォルトの名無しさん
07/07/01 19:05:54
>>662
え、めっちゃ有名な話だと思ってたよ。
俺の持ってる本にも書いてあるし。

667:デフォルトの名無しさん
07/07/01 19:07:11
>>664
&#955;

668:デフォルトの名無しさん
07/07/01 19:26:31
>>662
顔殴られたクマーみたい

669:デフォルトの名無しさん
07/07/01 19:36:59
lambdaと打ったらリガチャ扱いでλ出す、くらいのことは出来るだろう

670:デフォルトの名無しさん
07/07/01 20:03:58
>>666
俺、貧乏で本買えないから…

671:デフォルトの名無しさん
07/07/01 20:11:24
>>670
図書館行くとよいぞ。


672:デフォルトの名無しさん
07/07/01 20:24:56
関係ないけど、教養のためにとλ計算のプログラムを今書いてますが、
bashとかperlみたいに$を使う事にしてます。
(厳密には$と.で識別子を挟む。)
束縛子に$を使って、参照は識別子そのままなので、用法は逆ですけどね。
($m. $n. $s. $x. m s (n s x)) ($s. $x. s x) ($s. $x. s (s x))
こんな感じで

673:デフォルトの名無しさん
07/07/01 21:00:01
>>671
あんた賢いな

674:デフォルトの名無しさん
07/07/01 21:12:31
SKKのほうがいいよ

675:デフォルトの名無しさん
07/07/02 07:03:32
>>660
>>661
とても親切な返答有り難うございます。分かりました!


676:デフォルトの名無しさん
07/07/02 07:43:04
>>662
俺LISPで採用けってい

677:デフォルトの名無しさん
07/07/02 11:00:15
俺Lisp作ってる人ってどれくらいいるのかな

678:デフォルトの名無しさん
07/07/02 13:27:38
少なくとも今ある処理系の数だけあるよな

679:デフォルトの名無しさん
07/07/02 14:14:52
俺LISPといえるほどの独自仕様の処理系ってそんなにあったっけ

680:デフォルトの名無しさん
07/07/02 16:35:54
だから俺Lispなんじゃね?

681:デフォルトの名無しさん
07/07/02 18:14:29
lispじゃないけど>>662っぽい記法使ってる言語には
URLリンク(bugyo.tk)
こんな変なのがあったぞ。

682:デフォルトの名無しさん
07/07/02 20:18:53
ホントだ、良く見つけたね。

個人的には ^ は return に見えてしまう...

683:デフォルトの名無しさん
07/07/02 20:55:16
このSmalltalkerが

684:デフォルトの名無しさん
07/07/02 21:32:48
Metaluaはluaでlispのマクロっぽい事ができるらしい。
いっちょ前にquasi-quoteっぽい仕組みまである(様に見える)。

685:デフォルトの名無しさん
07/07/02 22:31:01
本質的にはλは開き括弧、.は閉じ括弧だから
[]でも<>でも{}でも`'でも良いのに
接頭字+空白セパレタが主流なのはなぜなんでしょうね?

686:デフォルトの名無しさん
07/07/02 22:34:22
書き込んでから気づきましたが
歴史的には接頭字の方が先なんでしたね

687:デフォルトの名無しさん
07/07/03 14:32:31
質問です。
アトムとリストと、
car,cdr,cons,atom,eq
これでどうやって足し算が出来たりするのでしょうか?

688:デフォルトの名無しさん
07/07/03 14:41:01
>>687
チャーチ数 でググれ

689:デフォルトの名無しさん
07/07/03 14:42:49
リストの長さで0以上の自然数を表すのがよく使われる手だね。
そうすると足し算はappendになる。他も自分で考えてみな。



690:デフォルトの名無しさん
07/07/03 14:54:04
あ~、足し算はappendなのか。
だいたいイメージつかめた。
有り難うございます。

691:デフォルトの名無しさん
07/07/03 16:35:22
ん、やっぱりなんか引っかかります。
リストの長さで0以上の自然数を表すなら、
()=0
(())=1
((()))=2
は納得できるのですが、
これでどうやってリストを表すのでしょうか?
アトムしか表現できないんじゃないんですか?

692:デフォルトの名無しさん
07/07/03 18:49:44
()
(())
(() ())
(() () ())

693:デフォルトの名無しさん
07/07/03 19:35:56
>これでどうやってリストを表すのでしょうか?
言ってる意味が分かんないなぁ

694:デフォルトの名無しさん
07/07/03 20:56:23
砂場の石ころでもできる
だから何ってやつ

695:デフォルトの名無しさん
07/07/03 21:13:45
何段階かの問答を経て、ようやく「自分が何を訊ねたいのか」を掴む質問者っているけど、
この人もそれと同様、これから自分の疑問の内容がわかるんだと思う。

696:デフォルトの名無しさん
07/07/03 21:36:29
URLリンク(rikunabi-next.yahoo.co.jp)

リスパーなら演技くらいはできないとな。

697:デフォルトの名無しさん
07/07/03 21:42:57
マジな話、Lisperと話しするときは教養がいるよ。
プログラム言語の話とかだけじゃ相手にしてもらえない。
科学好き、数学好きとかが多すぎる。

698:デフォルトの名無しさん
07/07/03 22:03:06
個人的には数学は敬して遠ざけておきたい

そんな僕でも立派なLisperになれるでしょうか

699:デフォルトの名無しさん
07/07/03 22:09:47
ところで河合さんの頭は本物なの?


700:デフォルトの名無しさん
07/07/03 22:13:10
>>698
GNU GPLを暗唱できたらあるいみ立派なLisperになれるかも!

701:デフォルトの名無しさん
07/07/03 22:14:31
687さんは純Lispが五つの基本関数「だけ」で
本当にチューリング完全かどうか
疑問に思ってるんじゃないですか?

ちょうど1ヶ月前の自分と同じで

マッカーシーの論文斜め読みしたら
関数は五つで良いけど
→表記も含まれるから
condかifスペシャルフォームも必要みたいに感じました

本当に五つの基本関数(と真偽値)「だけ」でチューリング完全なら
自分にも教えてください

702:デフォルトの名無しさん
07/07/03 22:15:18
Lisp と GPL は全く関係無いな

703:デフォルトの名無しさん
07/07/03 22:25:57
おいおい、Gの付く話はやめてくれよ

704:デフォルトの名無しさん
07/07/03 22:35:59
>>701
再帰かループがないとどうにもならんよ


705:デフォルトの名無しさん
07/07/03 22:41:00
大前提としてλ式が必要

706:デフォルトの名無しさん
07/07/03 22:41:26
>>704
と、いうことはcondまたはifと
関数抽象のためのlambdaが必要ということになりますか
要素としては5関数2特別式でチューリング完全

707:デフォルトの名無しさん
07/07/03 22:44:52
そうか、lambdaだけでチューリング完全ですね
でもそうすると5関数の立場が…

708:デフォルトの名無しさん
07/07/03 22:48:57
Lispエバリュエータを書くのに最低限必要な関数だと思うが

709:デフォルトの名無しさん
07/07/03 22:51:55
λ算法とLispのlambdaは等価ではないので

710:デフォルトの名無しさん
07/07/03 23:01:19
そういやifはλで表現できたんだな…。

711:デフォルトの名無しさん
07/07/03 23:07:44
>>709
どこらへんですか?
正格評価だからですか?

712:デフォルトの名無しさん
07/07/04 00:57:12
>>708
チューリング完全である≠"apply" or "eval"が記述できる
lambdaがあればチューリング完全だけど
"Lisp"の機能を満たすために5つの基本関数が必要である

ってことですか?

713:デフォルトの名無しさん
07/07/04 10:57:50
リストの n 番目「以外」の要素のリストを得るにはどうすれば良いでしょうか
例えば (0 1 2 3 4 5 6 7 8 9) から 3 を除いた (0 1 2 4 5 6 7 8 9) が欲しいです
それとも、もしかすると Gauche の添付ライブラリの中にありますか…?

一応自分でも書いてみたのですが
かなり長~くなってしまって。

714:デフォルトの名無しさん
07/07/04 11:10:12
(define (exclude-nth n l)
(cond
((null? l) l)
((= n 0) (cdr l))
(t (cons (car l) (exclude-nth (1- n) (cdr l))))))


715:デフォルトの名無しさん
07/07/04 11:25:50
好みの分かれるところか?
(define (exclude-nth n l) (append (take l n) (drop l ( + n 1))))

(exclude-nth 3 '(0 1 2 3 4 5 6 7 8 9))
=>(0 1 2 4 5 6 7 8 9)


716:デフォルトの名無しさん
07/07/04 12:12:11
>>715
takeは必ずリストつくるからappend!でセルを節約したくなる貧乏性な俺


717:デフォルトの名無しさん
07/07/04 12:56:33
レス感謝です。

>714
勉強になります。

>715
takeとdrop、こんなのあったんですね。
こんなに短くなるとは…

718:デフォルトの名無しさん
07/07/04 12:58:18
まさかこのオペレータを使う日が来るとは……。

(use gauche.sequence)

(define (exclude-nth n l)
(reverse!
(fold-with-index
(lambda (i e pr)
(if (= n i)
pr
(cons e pr)))
'()
l)))

;(exclude-nth 3 '(0 1 2 3 4 5 6 7 8 9))
;; =>(0 1 2 4 5 6 7 8 9)

719:デフォルトの名無しさん
07/07/04 13:03:35
>718
このオペレータ…とはどれのことなのか
Schemeに不慣れな私には判りませんが
…えーと…
ちょっと勉強がてら気合い入れて読んでみます…

720:デフォルトの名無しさん
07/07/04 13:05:28
fold-right-with-index(仮称)があればreverseしなくていいのにね。


721:デフォルトの名無しさん
07/07/04 13:29:05
fold-rightはある意味reverse以上のコスト


722:デフォルトの名無しさん
07/07/04 13:41:43
【問題】 >>713を不完全リスト(最後のcdr部がアトム)に対しても
適用できる様にexclude-nthを拡張せよ
ex.)
(exclude-nth 2 '(0 1 2 . 3)) => (0 1 . 3)
(exclude-nth 3 '(0 1 2 . 3)) =>(0 1 2)
(exclude-nth 4 '(0 1 2 . 3)) =>(0 1 2 . 3) ;; 同値

723:デフォルトの名無しさん
07/07/04 13:59:22
やってみました。あってる?
(define (exclude-nth n ls)
(cond ((null? ls) '())
((= n 0) (if (not (pair? ls)) '()
(cdr ls)))
((not (pair? ls)) ls)
(else (cons (car ls)
(exclude-nth (- n 1) (cdr ls))))))

724:デフォルトの名無しさん
07/07/04 14:21:52
つきあってくれてありがとう。
多分合ってる。
用意してた答えはコレ

(define (exclude-nth n l)
(let loop ((n n)(r '()) (l l))
(if (pair? l)
(loop (- n 1) (if (= n 0) r (cons (car l) r)) (cdr l))
(if (null? l)
(reverse r)
(if (= n 0)
(reverse r)
(apply list* (reverse (cons l r))))))))
我ながらapply list* reverseは美しくないよな・・

725:デフォルトの名無しさん
07/07/04 14:28:04
それって破壊もlist*も使わずに末尾再帰で書ける?

726:723
07/07/04 14:30:40
named-letでもやってみたんだけど、いまいち自信がないというか…。
(define (exclude-nth n ls)
(let loop ((ls ls) (n n) (acc '()))
(cond ((null? ls) (reverse! acc))
((= n 0) (if (not (pair? ls))
(reverse! acc)
(loop (cdr ls) (- n 1) acc)))
((not (pair? ls)) (append (reverse! acc) ls))
(else (loop (cdr ls) (- n 1) (cons (car ls) acc))))))


727:デフォルトの名無しさん
07/07/04 14:33:34
list*相当を作っちまえば・・
(define (apply-list* l)
(define (loop l)
(if (and (pair? l) (pair? (cdr l)))
(cons (car l) (loop (cdr l)))
(car l)))
(loop l))
って、これは末尾再帰じゃないしな

>>726
appendすりゃよかったのね

728:デフォルトの名無しさん
07/07/04 23:17:00
>>709
λとlambdaが等価じゃないところ1つ見つけた
λxyz.E = λx.λy.λz.E
(lambda (x y z) E) ≠ (lambda (x) (lambda (y) (lambda (z) E)))
他にどんな違いがあるかなぁ

729:デフォルトの名無しさん
07/07/04 23:50:27
チューリング完全を実現するのに必要な
最低限のデータ構造って何だろう。
リストが使えないとダメなのかな?

730:デフォルトの名無しさん
07/07/04 23:59:27
例えば配列があればリストは作れる。チューリング機械の定義により何かの記憶機構は必要。

731:デフォルトの名無しさん
07/07/05 00:13:14
SKだけでチューリング完全なのに
純Lisp5関数でチューリング完全じゃない(?)のは不思議
eqやatomがTやNILを返すんじゃなくて
carとcdrを返すなら何とかなりそうな気もする
関数を返す関数くらいは必要な気がする

732:デフォルトの名無しさん
07/07/05 00:16:37
>>713
CL loop マクロは見易いと思う。
(defun exclude-nth (n l)
(loop for x in l and idx from 0 if (/= idx n) collect x))
だけど >>722 の不完全リストだと書けないかな。

733:デフォルトの名無しさん
07/07/05 00:57:12
>>729
整数が1つあれば十分だろ。コンピュータのメモリなんて見方によっては
ものすごく桁数が多い1つの2進数なんだし。


734:デフォルトの名無しさん
07/07/05 00:59:48
でもそれって結局、無限長の配列を仮定してることにならないかだぜ?

735:デフォルトの名無しさん
07/07/05 01:04:59
無限長の配列でも一つの整数でも同じことだろ。
どちらか片方あればもう片方が表現できる。

736:デフォルトの名無しさん
07/07/05 01:19:56
lispマシンってメモリアドレスって有ったんだろうか?

737:デフォルトの名無しさん
07/07/05 01:41:20
>>736
Symbolics社のはタグ付きアーキだったってC-FAQに書いてあった
だからポインターが数値でない

738:デフォルトの名無しさん
07/07/05 02:14:33
>>736
なくてどうする

739:デフォルトの名無しさん
07/07/07 20:47:56
read-eval-printループのevalの部分を別のコンピュータで実行させるフレームワークみたいなのってない?
作ろうと思えば簡単に出来そうなんだが、誰かやってる人いないかなと思って。

740:デフォルトの名無しさん
07/07/07 21:21:17
slime

741:デフォルトの名無しさん
07/07/07 21:22:26
>>739
readしないでevalって言うのはできるん?
sexpを通信先のマシンでreplしてるところに食わせるのならslimeがそうじゃない


742:739
07/07/07 21:43:31
>>740-741
サンクス

gauche使ってるんだが、gauche.listenerってのを見付けた。
ちょいいじってみる。

743:デフォルトの名無しさん
07/07/10 01:23:48
Gaucheでselect使ってサーバー書こうと思ってたんだけど質問。
selectで書き込み可能でも、ソケットバッファを越えたサイズを書き込もうとするとブロックするよね。
unixのwrite(2)ならバッファを全部フラッシュしないからブロックしないように書けるんだけど。
生のwrite(2)をそのままGaucheから呼べないの?

744:デフォルトの名無しさん
07/07/10 05:40:22
今はできないんじゃなかったっけな。0.9までになんとかするって話だったと思う。

745:デフォルトの名無しさん
07/07/10 06:42:30
>743
サーバ書くモチベをちょっとだけGaucheのソース修正に割くんだ。
そしてうまく動いたらパッチ提供してあげたら喜ばれるんじゃないかな。
ライブラリ作成者側のオナニーテストよりは実アプリによる動作テスト
の方が意味あるだろうし。

746:743
07/07/10 09:30:08
>>744-743
了解!

綺麗なソースコードだからちょっといじってみる。
cvs headに比べると、debian etchのやつはだいぶ古いんだな。

今のところはスレッド使う方向に逃げるってのが正解みたいだね。


747:743
07/07/10 10:02:44
アンカミスった>>744-745だった

748:デフォルトの名無しさん
07/07/11 04:17:03
卒論を書かなきゃ行けないんだけれど、何も思いつかない。
思いついたとしても既に実現されている。
計算機の歴史なんてまだ100年もたっていないのに、
その先行研究の凄さにはひれ伏すしか無い、という
今日この頃の学部生なんですが、何か面白いお題ないですかね?
スペックとしてはCommon Lispが出来るくらいなんですが。
「こんな事やったら面白いんじゃないの?」
とか
「コレが無いから困っている。でもつくるのメンドイ」
っていうの有りませんか?

749:デフォルトの名無しさん
07/07/11 09:34:11
>>748
S式で書ける TeX とかどうよ

750:デフォルトの名無しさん
07/07/11 15:56:13
>>749
え、無いの?
HTMLをS式で表現するものがあるのに?

751:749
07/07/11 20:20:40
いや、あるかもしれんけど。
そんなに真剣に調べたことはないんで。

752:デフォルトの名無しさん
07/07/11 22:16:07
ちょっと違うかもしれないけどmaxima があるからなー>tex

>>748
オープンソース版のAllegroCache(OODB)作るってのはどうよ?

753:デフォルトの名無しさん
07/07/11 22:51:01
皆さんお返事有り難うございます。
そりゃ、自分もいろいろ考えたんですよ。
例えば色でプログラミングできたら面白いかな~とかね。
正方形を9分割した物が有って、
白→nil
黒→t
が決定。
んで色がいくつ塗っているかでチャーチ数を表す。
緑→(())
緑と黄色→(()(()))
だから、緑と赤は等しい訳です。直感的ではないですけれど。1=1なんで。
んで、最低限の関数の色を決める。
car→オレンジ
とかね。
でも、これじゃ関数定義できないし、逆にややこしいし、
大きい数の計算は出来ないし、データ構造の定義は出来ないし、
何の役に立つのか説明しにくい。
んで、考えれば考えるほどどうすれば良いのか分からなくなって、
皆さん卒論でどんなことしていたか質問してみたんです。
すいませんでした。

754:デフォルトの名無しさん
07/07/12 00:16:04
卒論とかだと学問ぽく見せる必要があるから、Lisp 族は人気ないだろ。
強い型付けのメリットとして、とても研究な感じになるという利点があるから
卒論は Haskell とか ML 系でなんかごにょごにょするほうがお手軽じゃないかな。


755:デフォルトの名無しさん
07/07/12 00:47:38
> オープンソース版のAllegroCache(OODB)作るってのはどうよ?

それならむしろAllegroStore

756:デフォルトの名無しさん
07/07/12 01:46:49
>>754
>強い型付けのメリットとして、とても研究な感じになるという利点があるから
>卒論は Haskell とか ML 系でなんかごにょごにょするほうがお手軽じゃないかな。
カリー・ハワード対応の事ですか?
それで、チューリングマシンの停止問題なんかを証明しても、
そりゃ学問的だけれども新規性がないんじゃ。
誰も証明してない命題が有るなら別なんでしょうけど。
>>755
AllegroStore?AllegroCache?
なんぞコレ?
clispしか使った事無いのでいまいち何に使うのかさっぱり?
総称関数を保存して共有できるようになる代物?
そもそもデータベースを触った事が無いからデーターベースからして
よくわかんないです。




757:デフォルトの名無しさん
07/07/12 01:47:44
一言で言うなら 卒論書く前にもっと勉強しろよ

758:デフォルトの名無しさん
07/07/12 02:20:34
まあ4年の7月なんてこんなもんだ。

759:デフォルトの名無しさん
07/07/12 02:23:19
>753
世の中にはGPGPUというものがあってだな

760:デフォルトの名無しさん
07/07/12 03:05:22
>>759
自分、面白そうな事思いついたです。
CUDA使って、Lispのインタプリタ作るのってどうでしょうかね?
そして、clispとどっちが計算が速いか検討するの。
これだと、今のところ誰もやってないだろうし、
リスト処理ってGPU向きの処理だと思いませんか?

761:デフォルトの名無しさん
07/07/12 04:03:19
わざとっぽいのは相手にしない方が

762:754
07/07/12 07:51:20
>>756
どっからカリーハワードだの停止性判定だの証明だのがでてきたんだよ。
そーゆうんじゃなくて、なんか小物の研究でも Haskell や ML ならそれっぽく見えるだろって事。
つうかテーマは研究室の先輩や教官とよく相談したほうがいい…。
たとえば超並列分散 Lisp をつくるぜ!!と決めたとして、周囲の支援が得られず完全自力じゃ評価もまともにできんし、学費がもったいない。

763:デフォルトの名無しさん
07/07/12 10:50:20
じゃあ Lisp の型推論がどこまでできるかとか

764:デフォルトの名無しさん
07/07/12 15:26:16
>>762
>そーゆうんじゃなくて、なんか小物の研究でも
> Haskell や ML ならそれっぽく見えるだろって事。
>つうかテーマは研究室の先輩や教官とよく相談したほうがいい…。
>たとえば超並列分散 Lisp をつくるぜ!!と決めたとして、周囲の支援が
>得られず完全自力じゃ評価もまともにできんし、学費がもったいない。

いや、お恥ずかしい話なんですが自分の大学は大学院が無いんで
先輩なんていないんです。
それに指導教官は「何か作れば良いよ~」という態度なんで
自由な反面、アイデアが必要なんです。
自分の友達は「大学のSNSをxoopsで作る」でOKと言われてました。
自分は「さすがにそれじゃアレかなぁ」と思って。
自分はCUDAでLisp処理系は面白い案だなと思います。
誰でも思いつきそうだけれど、今のところ誰もやってないし、
自分の処理系欲しかったんで。
それじゃ、パソコン買うところから始めなきゃならないんですが(Macなんで)
頑張ってみますね。
C言語は1年くらい触ってないし、マルチスレッドプログラミングは初めてなんで
不安ですが。
出来たらUpするんで、コードレビューしてください。
タライ回し関数が速く動くといいなぁ。

765:デフォルトの名無しさん
07/07/12 16:20:23
逐次処理しなきゃだめな部分は早くならないんじゃないのかな。


766:デフォルトの名無しさん
07/07/12 16:34:47
>>764
くそうらやましす

767:デフォルトの名無しさん
07/07/12 20:12:46
一口で大学と言ってもピンキリなんだな

768:デフォルトの名無しさん
07/07/12 21:17:35
型推論 1 (変数、戻り型が単一の型に定まる物)
(define (ack m n)
(cond ((zero? m) (+ n 1))
((zero? n) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1))))))

(ack (m ?x) (n ?y)) : (result ?z) から ?x ?y ?zの型を求める

(zero? m) => (type_a) : bool
1 => int
(+ n 1) => (int int) : int から ?x = int
(zero? n) => (type_a) : bool
m, nがintなのでzero?の引数は intと仮定して良い
(- m 1) => (int int) : int から ?y = int
末尾コンテキストは+ とackのみなので?z = int
これでack内の +-zero?演算子はintという前提で最適化でける

・・という感じで良い?


769:デフォルトの名無しさん
07/07/12 21:36:38
>(tail-map list '(a b c . d))
=>((a) (b) (c) d)

(define (tail-map proc x)
(let loop ((l x))
(if (pair? l)
(cons (proc (car l)) (loop (cdr l)))
(proc l)))) ;procをcdrにも適用する

(tail-map (proc ?x) (x ?y)) : (result ?z) から ?x ?y ?zの型を求める

(l ?v) = ?x
(pair? l) (type_a) : bool
この中ではl = pairと確定
(car l) => (pair) : type_b
(cdr l) => (pair) : type_c
(proc ~) (type_a) : type_d
(loop ~) (type_c) : type_e
(cons ~) (type_b type_c) : pair
(proc not-pair) : type_f
以上からprocは1引数でtype_aまたはnot-pairを受け取りtype_d|type_fを返す、
xはpairかnot-pair
tail-map の戻り型は pair もしくはprocの戻り型に依存

・・・もうわかんね

770:デフォルトの名無しさん
07/07/12 22:08:54
Schemeが(Haskellほどでないけど)関数的であるとされる根拠の1つに
識別子が一度ある場所に束縛されると
他の場所に束縛を変更される事がないっていうのがあるけど
それをいうならCだって同じですよね?
一度宣言した変数のアドレスはスコープ内で一定

むろん関数的であるという最大の根拠は関数が第一級の値であるというところにつきるんでしょうけど

でもR5RSでは関数のリテラル表記はない、でもそれぞれの実装でサポートしてもよいって扱いですけどね
lambdaは関数のリテラル表記だっていう解説もちらほら見ますが

771:デフォルトの名無しさん
07/07/12 22:12:32
「識別子が一度ある場所に束縛されると他の場所に束縛を変更される事がない」ことが
「関数的である」とは思わないけど

772:デフォルトの名無しさん
07/07/12 22:22:29
>>771
いや、参照透過性とは関係ないのに
識別子の束縛が変更されない事に言及する解説をよく見る気がしたので

773:デフォルトの名無しさん
07/07/12 22:25:43
ヒント: 言論の自由

774:デフォルトの名無しさん
07/07/12 23:20:13
>>768
なんかところどころよくわかんないような。

自分で目の子でやったらこんな感じになったけど、どうかな。
まず (zero? m) から m : number
次に (+ n 1) から n : number
だから ack : number * number -> ?z で
else 節の (ack (- m 1) (ack ...)) の第二引数を見ると ?z = number
∴ ?x = ?y = ?z = number

775:デフォルトの名無しさん
07/07/12 23:43:17
zero?って渡される引数がnumberのみと限定していいのかな。
リストとか入ってきたらエラーでいいんだっけ?
まあそういう判定が減るから全体で3倍ぐらい速くなるかな。

それはそれとして、ackみたいな単純なケースは結構作ってるうちに
適当なのができそうだからどうでもいいと思う。
問題は型が定まらない場合。
上、named-let余計だった。
(define (tail-map proc l)
(if (pair? l)
(cons (proc (car l)) (tail-map proc (cdr l)))
(proc l)))
まあ普通のmap1でもいいけど。
(define (map1 proc l)
(if (pair? l)
(cons (proc (car l)) (map1 proc (cdr l))) '()))

この場合procが確定するまで保留にすべきなのかな?
procは1引数取って何か返す、ぐらいの情報しかないよね。

776:デフォルトの名無しさん
07/07/12 23:50:20
>>775
> zero?って渡される引数がnumberのみと限定していいのかな。
R5RS みると (zero? z) と書いてあって、 z は複素数を表すメタ変数ということだから
そこは問題ないと思う。

で、今気付いたけど = にしてしまうとまずいね。例えば三行目で
(zero? n) が (<= n) だったりすると number ではダメで、
real に推論されなきゃいけない。

777:デフォルトの名無しさん
07/07/12 23:59:38
いや、この際大雑把に「数字かどうか」ぐらいの区別でよくないですか?
アドホックにでも最適化に結び付けて、お手軽に型推論による効果
を体感したいというか。
>>775のmapにしてもフローチェックすればpair?の判定で
car/cdrのpair判定が省略できるとか、そんなレベルから徐々に
大掛かりな仕掛けを考えていければいいかなと。

778:デフォルトの名無しさん
07/07/13 00:01:00
>>777
うん、その方が健全な気がしてきた

779:デフォルトの名無しさん
07/07/13 08:55:16
え、そのほうが soundnessがいえるんですか?

と、あえて誤読をしてみる。


780:デフォルトの名無しさん
07/07/13 13:14:34
誤読というより誤爆?

781:デフォルトの名無しさん
07/07/14 06:51:44
俺、凄い事思いついた!
GHC立ち上げると、
Prelude>
ってでるじゃん。
なんでプレリュード?とずっと思ってたんだけれど、
これってもしかして、
Franz Lisztの前奏曲から来てるんじゃないの?
リストつながりで。

782:デフォルトの名無しさん
07/07/14 12:17:40
Franz Lisp

783:デフォルトの名無しさん
07/07/14 13:50:04
>>781
prelude って一般名詞じゃないの?

784:デフォルトの名無しさん
07/07/14 16:01:21
俺も Prelude は一般名詞だと思う。

785:デフォルトの名無しさん
07/07/14 16:54:13
ネタにマジレスなんとやら

786:デフォルトの名無しさん
07/07/14 16:58:10
ネタにマジレスを重ねるというネタだったのにマジレスされた…

787:デフォルトの名無しさん
07/07/14 17:13:36
でもそれが、ネタにマジレスを重ねるというネタにマジレスするというネタかもしれないと考えるのが危機管理というものではないだろうか。

788:デフォルトの名無しさん
07/07/14 17:17:54
ネタになりかけのレスと、ネタになる余地のないレスの区別ぐらいつきますわよ。

789:デフォルトの名無しさん
07/07/14 17:19:30
だがしかしそれは主観に左右されるものであるから、絶対的な答えなどないのではないか
つまりは君の意見などどうでもよいのですわよ。

790:デフォルトの名無しさん
07/07/14 17:21:27
ここ、Haskell スレだと思ったら Lischeme スレだったのか!

791:デフォルトの名無しさん
07/07/14 17:27:55
むしろ寝たすれ家と思う田

792:デフォルトの名無しさん
07/07/15 21:07:40
自分がアホっぽく見える流れになっちゃったら、
「何か狙ってた」ことにして「お前らのせいでそれがダメになった」と嘆いとくのは基本。

793:デフォルトの名無しさん
07/07/15 21:10:43
誤爆?

794:デフォルトの名無しさん
07/07/15 23:41:45
アホの子はかあいいよ?

795:デフォルトの名無しさん
07/07/20 16:31:39
gaucheのCVS Headって、ここ最近コンパイルできたためしが無いんだけど、
これってパッチとか作る価値があるの?
それとも、shiroさんの手元ではできてるの?

796:デフォルトの名無しさん
07/07/20 18:36:58
wilikiかlingrあたりで聞いてみたら? HEAD使ってる人は何人もいると思うけど。

797:デフォルトの名無しさん
07/07/20 20:15:04
普通にできてる。ドキュメントよまずにやってない?DISTほげ

798:795
07/07/21 00:53:52
HACKING とかは読んでる。
Cのコンパイルじゃなくて、schemeコードを実行するところで
ライブラリが見つからないとかいろいろ出る。

システム既存のgaucheと衝突してるのかなあ…?

lingrで、makeにいろいろオプション渡すとできるよって言ってた人が
いて、それで前進したけどまだ止まる

もう少しあがいてみるかな

799:デフォルトの名無しさん
07/07/21 01:16:10
そうか。
俺は ./DIST gen を忘れてて、コンパイルできねーな?と思ってた事があったんでひょっとしてと思ったんだけどね。
で、どんなエラーメッセージなの?

800:デフォルトの名無しさん
07/07/21 21:01:50
>>795
俺もそれではまった。
最近はGauhceのコンパイルにGaucheを要求するので、
古いGaucheを使ってるとgoshがエラー出す。

Gauche 0.8.10(release)使えばコンパイルに成功する。
Gauche 0.8.10(release)すらコンパイル出来ないときは、
バージョンを一個ずつ上げてみて。

801:795
07/07/22 17:34:53
>>800
サンクス
調べてやってみます

802:デフォルトの名無しさん
07/07/23 01:00:07
schemeってcommon lispのsymbol-valueに相当するもの無いけどevalを使うしかないんですか?

やりたいことはalistに文字と関数のペア入れておいてその関数を呼び出したいんだけど。
'(#\a . func_a)
だとfunc_aは関数にならないから
`(#\a . ,func_a)
と書いてるんだけどいちいち','を書くのがめんどい。
こういうところはマクロを使うのがセオリーなの?

803:デフォルトの名無しさん
07/07/23 07:13:30
Schemeでは「symbolに値が入ってる」わけじゃないからね
処理系によっては実行時にはシンボルと値の結び付きは完全に忘れちゃってる
可能性もあるし。
処理系依存で良ければ、symbol-valueとかglobal-variable-refとかが使える
場合もある。ポータブルにやるならevalしかないだろうね。
「文字と関数のalist」とかは普通にバッククオート使っちゃうけどなあ。

804:デフォルトの名無しさん
07/07/23 08:50:18
個人的には evalも邪道だと思う。
そもそも R4RS には evalも必須じゃなかったし。
万独裁なら cons でも使え。



805:802
07/07/23 11:14:54
>>803
なるほどね。R5RSをよく読んだらそう書いてあったよ。
Common Lisp陣営がSchemeを批判するときの論点がそこなのね。

>>804
確かにevalは使いたくない。

今まで通りquasi quote使って関数をunquoteすることにしました。

806:デフォルトの名無しさん
07/07/23 20:16:11
>>805
> >>803
> なるほどね。R5RSをよく読んだらそう書いてあったよ。
> Common Lisp陣営がSchemeを批判するときの論点がそこなのね。

全然違うと思うが。
Schemeにも1st class objectとしてのシンボルがあればなあという
CLerもいるっちゃいるだろうけどさ。

807:デフォルトの名無しさん
07/07/23 23:38:53
ブラックボード黒田

808:デフォルトの名無しさん
07/07/23 23:49:38
kuroタソ(*´д`*)/ヽァ/ヽァ

809:デフォルトの名無しさん
07/07/25 09:38:10
URLリンク(www.tekkon.net) これってlisperの話?w

810:デフォルトの名無しさん
07/07/27 01:42:56
質問があります。

lispで、他の言語も実装した(というか、DSLを作ってみたというか)
処理系があったと思うのですが、ご存じないでしょうか?

lispでよく用途に合わせた言語を再実装したとう話を聞くのですが、
なかなか実例に合わず、う~ん?と思っていたのですが、
これを見て、lispすげーと、唸った覚えがあります。

けっこう、最近の言語だったと思うのですが、ご存じないでしょうか?
確か、DSLとしては、ひとつとして、JavaScriptのサブセットを実装していました。
他の言語のサブセットもあったと思うのですが、覚えていません。

もしかしたら、Lispじゃなくて、もしかしたら、schemeの実装だったかもかわかりません。

811:デフォルトの名無しさん
07/07/27 01:58:31
もしかしたら、lispじゃなかったかもしれません orz
うろ覚えなのですが、中間形式として、S式を使っていたような?
言語内に、いくつかのプログラムがあってそれを組み合わせて、使っていたような気がします。

812:デフォルトの名無しさん
07/07/27 02:05:25
>>811
『On Lisp』の24章に、Common Lisp による埋め込み言語としての Prolog 実装の話はあるけど。
ただ Prolog は最近の言語ってわけでもないし……。

813:デフォルトの名無しさん
07/07/27 03:48:27
>>811
まさか、TAOじゃないよな。

814:デフォルトの名無しさん
07/07/27 04:30:18
Coke & Pepsi?


815:デフォルトの名無しさん
07/07/27 14:31:02
>>814
それそれ!!それです。
ありがとさんです。

CokeとPepsiとJoltです。

ただ、今見たら、素人の手に負えそうなものではないことがわかったw

816:デフォルトの名無しさん
07/07/27 17:25:35
オナニーしすぎてモーホー炎になりますたw

817:デフォルトの名無しさん
07/07/29 00:07:51
>>810
HaskellでPerlを実装した話じゃなくて?

818:デフォルトの名無しさん
07/07/29 00:31:50
haskellはschemeで作られました

819:名無しさん@そうだ選挙に行こう
07/07/29 02:31:09
schemeはschemeで作られました

820:名無しさん@そうだ選挙に行こう
07/07/29 13:11:31
・[1492] L2Lisp in Ruby((鈴))
 静的スコープ、末尾呼出し(末尾再帰を含む)の最適化、およびマクロを備えた
近代的なLispの小さなインタープリタをRuby(およびJRuby)で作ります。Rubyの
データ型と親和性が高く、簡単に組込み関数を増設できる手頃なLisp処理系として
利用できます。
URLリンク(codezine.jp)

821:名無しさん@そうだ選挙に行こう
07/07/29 13:38:23
rubyなら継続も比較的簡単に実装できると思うんだけど
なんでまた半端な物作るかな
CL厨がまた文句言いにくるよ

822:名無しさん@そうだ選挙に行こう
07/07/29 14:01:32
「簡単に組込み関数を増設できる手頃なLisp処理系」に継続も装備させようという発想が凄いな。

823:名無しさん@そうだ選挙に行こう
07/07/29 15:56:16
手頃な処理系というのならForthの方が良いと思うけどな。

元にしたL2Lispのページを見ると、継続(というかcall/cc)は不完全らしいね。


824:名無しさん@そうだ選挙に行こう
07/07/29 16:07:56
Forth でも良いだろうし Lisp でも良いだろう
大して変わらんよ

825:名無しさん@そうだ選挙に行こう
07/07/29 20:15:49
>>821 漏れ CLer だけど……どの辺に文句つける要素があるんだ?


826:デフォルトの名無しさん
07/07/29 20:28:16
気にする事は無いよ


827:デフォルトの名無しさん
07/07/29 20:34:11
むしろ継続継続とSchemerが喰いついている件。まぁ、あんまり使われないだろうけど。Rubyistがわざわざこれを使うとは思えない。

828:デフォルトの名無しさん
07/07/29 20:58:35
いわんや Lisper おや

829:デフォルトの名無しさん
07/07/29 21:20:01
つーかLisperも使わんでしょこんなの

830:デフォルトの名無しさん
07/07/29 23:05:29 0
そういう問題ではない

831:デフォルトの名無しさん
07/07/29 23:12:06 0
なんだ、L2LispってPascalの処理系を移植しただけか。
ruby厨うぜえ。

832:デフォルトの名無しさん
07/07/30 00:09:14
>>825
ブラックボード黒田さんなら、黒板振り回しながら襲いかかるであろう仕様。

833:デフォルトの名無しさん
07/07/30 00:27:42
>>832
一般の Lispnik とは全く関係無いな

834:デフォルトの名無しさん
07/07/30 00:59:26
>>820
とてもコンパクトに出来ていて Ruby と Lisp の勉強になりました、

とレスしてほしいんだろw

835:デフォルトの名無しさん
07/07/30 04:54:46
継続ってのは後続のことですか?

836:デフォルトの名無しさん
07/07/30 15:43:41
>>834
そうそう。わかればいいのです(^^)

837:デフォルトの名無しさん
07/07/30 17:24:55
荒らすなよRuby厨

838:デフォルトの名無しさん
07/07/30 17:45:09
Schemeの質問をお願いします。
下記①と②を実行した場合、
それぞれの結果になるプログラムを教えて下さい。
①(my_makelist 5) を実行した結果 (1 2 3 4 5)
②(my_max ’(34 20 30 19)) を実行した結果 34

839:デフォルトの名無しさん
07/07/30 19:22:03
(define (my_max list) 34)
(define (my_makelist n) '(1 2 3 4 5))
こんなかんじ


840:838
07/07/30 19:40:06
>>839さん
実行しましたが、以下の結果が返ってきません。
①(my_makelist 5) -> (1 2 3 4 5)
②(my_max ’(34 20 30 19)) -> 34
もう一度お願いします。

841:839
07/07/30 19:46:15
うちでは動いています。
あなたの処理系のバグではないですか?


842:838
07/07/30 20:00:01
839>>さん
昨年、以下のサイトで、
URLリンク(www5a.biglobe.ne.jp)
これを『ChezEdit-NT Ver1.11 setup.exe』インストールしましたが、
何か問題があるのでしょうか?
他のプログラムは問題なく結果が返ってきます。
度々すいません。

843:デフォルトの名無しさん
07/07/30 20:10:51
あなたの頭に問題があんじゃないでしょうか?

844:838
07/07/30 20:13:43
>>839さん
①は以下の通りで何とかできました。
(define make_list(lambda (n)
(do ( (res (list n) (cons n res)) )
((= n 1) res)
(set! n (- n 1)))))

②の方は、以下のmax部分がうまく作れません。
(max 34 20 30 19) -> 34

お願いします。

845:839
07/07/30 20:19:04
それと同じ方法で書けば良いと思います

846:838
07/07/30 20:23:56
>>839さん
そこを何とか教えてもらえませんか?

847:デフォルトの名無しさん
07/07/30 20:25:38
Prologだと以下のようになります。Prologでまったりには
意地悪な人いないから、遊びにいらっしゃい。
my_max([A|R],Max) :- my_max(A,R,Max).
my_max(Max,[],Max).
my_max(A,[B|R],Max) :- B>A,my_max(B,R,Max),!.
my_max(A,[_|R],Max) :- my_max(A,R,Max).

848:838
07/07/30 20:29:15
>>847さん
遊びに行きたいのはやまやまですが・・・。
Prologではダメなんです・・・。
初心者で申し訳ありませんが、
誰か優しい人お願いします。

849:デフォルトの名無しさん
07/07/30 20:36:21
無能にキレる人というのは、無能によく出会うレベルの学校や職場にいる人が多い。
滅多に無能に出会わないようなハイレベルな環境で生きてる人は、もっと「余裕綽々にイジる」。

でも、無能によく出会うレベルの環境に居るってことは、自分のレベルも知れた物なんだよね、実は。
そのくせ上から目線というのはどういうことかというと、つまり自分では優秀なつもりなのに
現実がそれをまったく反映してくれない、そのギャップへの苛立ちを、こういう場所での小爆発で
少しでも解消しようという行為なわけ。

黒板におでこくっつけて頭冷やしたほうがいいよw

850:デフォルトの名無しさん
07/07/30 20:39:58
>>838
俺だったらschemeの上のprolog乗っけて>>847のコード動かすけどな。
On Lisp prologでぐぐって

851:デフォルトの名無しさん
07/07/30 20:43:10
>>849
黒板に縛りつけられてチョークを出し入れまで読んだ

852:838
07/07/30 20:57:30
あの、私女子大生なんですが・・・。
優しい方にはなんでもお礼しますから回答お願いします。

853:デフォルトの名無しさん
07/07/30 21:02:57
VIPでマンマンうpしたら考える

854:838
07/07/30 21:04:40
(i)
こうですか?わかりません(><)

855:デフォルトの名無しさん
07/07/30 21:29:23
>>849
えらく無能そうな人が出てきたなぁ

856:デフォルトの名無しさん
07/07/30 21:33:09
>>838
通りすがりのものですが、行きがかり上こちらも書いておく。
my_makelist(N,L) :- findall(M,for(1,M,N),L).

実用上はこれで良いのだが、ただライブラリを利用したようなものだから、
my_makelist(N,L) :- my_makelist(1,N,L).
my_makelist(N,N,[N]) :- !.
my_makelist(N,E,[N|R]) :- plus(N,1,M),my_makelist(M,E,R).
とすれば、自分で書いた気がする。
なんでこのスレがこんなに伸びるのか(Part 17)、視察に来た
だけです。PrologでまったりはまだPart 2なので。失礼しました。

857:デフォルトの名無しさん
07/07/30 21:47:43
>>849
そんなことどうでもいいから答えてあげたら?

858:デフォルトの名無しさん
07/07/30 22:37:17
>>840
(define my_makelist (cut iota <> 1))
(define (my_max l) (apply max l))

859:デフォルトの名無しさん
07/07/30 22:39:39
ほい

> (define (my_makelist n) (if (= n 0) () (append (my_makelist (- n 1)) (list n))))
my_makelist
> (my_makelist 5)
(1 2 3 4 5)
> (define (my_max lst) (if (null? (cdr lst)) (car lst) (my_max (cons (if (> (car lst) (cadr lst)) (car lst) (cadr lst)) (cddr lst)))))
my_max
> (my_max '(34 20 30 19))
34


860:デフォルトの名無しさん
07/07/30 22:42:00
(define my-max max) のほうがいいんじゃ... apply 使う意味がわからん

861:858
07/07/30 22:45:58
>>860
おいおい。それじゃ>>838で示してる仕様通りにならんだろ。

862:デフォルトの名無しさん
07/07/30 22:53:01
(define (make_list n)
(define (ml n l)
(if (= n 0) l (ml (- n 1) (cons n l))))
(ml n '()))

(define (my_max l)
(define (max2 x y) (if (> x y) x y))
(define (mm x l) (if (null? l) x (mm (max2 x (car l)) (cdr l))))
(mm (car l) (cdr l)))



863:デフォルトの名無しさん
07/07/31 01:08:21
>>839の動かないScheme処理系ってあるの ?

864:デフォルトの名無しさん
07/07/31 03:13:29
>>850
scheme なら schelog がいいんじゃない?

865:838
07/07/31 18:45:58
>>859さん
>>862さん
来るのが遅くなりましたが、
問題なく実行できました、
有難う御座いました。


866:838
07/07/31 18:47:26
もう一度、質問をお願いします。
以下のような結果が得られる、
前置記法から中置記法へ変換する手続きを教えて下さい。

(prefix->infix '(+ (* a b) c))) を実行した結果 (a * b + c)
(prefix->infix '(* 4 (** x 3))) を実行した結果 (x ** 3 * 4)

お願いします。

867:838
07/07/31 19:10:41
exp、opr、opd
のスタテックポインターを使って実行したいのです。
すいませんが、教えて頂けませんか?

868:838
07/07/31 19:12:11
× スタテックポインター
○ スタックポインター
間違えました。

869:デフォルトの名無しさん
07/07/31 19:17:02
「質問をお願いします」ってのは日本語としておかしい

870:デフォルトの名無しさん
07/07/31 19:18:30
>>867
そういう宿題がでるときはスタックつかって前置記法の式を中置記法に
手で変換する方法の説明があると思うけどな。それをプログラムであらわせば
いいだけだ。

871:838
07/07/31 19:19:55
確かにそうでした。
>>866に対する回答をお願いします。

872:デフォルトの名無しさん
07/07/31 19:30:03
>866
詳細不明だしあとは自分でやれよ
(define (prefix->infix p)
(if (pair? p)
(let ((l (prefix->infix (cadr p)))
(r (prefix->infix (caddr p))))
(append
(if (pair? l) l (list l))
(list (car p))
(if (pair? r) r (list r))))
p))

873:デフォルトの名無しさん
07/07/31 19:30:38
Schemeによる記号処理入門の演習問題5.8だね。

874:デフォルトの名無しさん
07/07/31 23:15:17
とりあえず、状況がわからんので答えてね。 >>838
1. 宿題の正確な問題文
2. 宿題の期限はいつまでか?
3. 教科書は手元にある?どこまで読んだ?
4. 教育的なヒントがほしいの?それともズバリ答えのほうがいい?


875:デフォルトの名無しさん
07/08/01 00:04:11
>>865
あれ?>>858は?

876:デフォルトの名無しさん
07/08/01 00:22:52
ずばり答えてあげると本人のためにならなくて良いな

877:デフォルトの名無しさん
07/08/01 00:27:08
一つ問題に答えてあげる代わりに
一つ問題を解いてもらえばいいんじゃないか
何が良いかな

878:デフォルトの名無しさん
07/08/01 00:31:51
嫁姑問題とかどうだ

879:デフォルトの名無しさん
07/08/01 01:27:04
つーか>838も自力解決できない奴に何か期待しても無駄。

880:デフォルトの名無しさん
07/08/01 01:57:45
彼はFizzBuzzをちゃんと書けるんだろうか

881:デフォルトの名無しさん
07/08/01 02:57:59
演算子の結合優先順位とか気にしなくていいのかなあ。とおもった。


882:デフォルトの名無しさん
07/08/01 03:19:11
気にしようぜ

883:デフォルトの名無しさん
07/08/01 08:42:45
演算子? そんなものあったっけ?


884:デフォルトの名無しさん
07/08/01 13:48:00
>>883
スレを読め

885:872
07/08/01 19:17:16
一応>>872に演算子の優先度追加したのも用意してたけど、
本人から何も反応ないしやめておく

886:デフォルトの名無しさん
07/08/01 22:14:38
そうなんだよな。ズバリ答えていいのか、872 みたいに段階的にいくべきなのかわかんないんだよなー

887:デフォルトの名無しさん
07/08/01 22:32:29
教育的回答をすればなんとかなるレベルの質問者じゃないので、
回答者とギャラリーが面白いと思う方でいいんでないの?


888:デフォルトの名無しさん
07/08/01 22:40:53
そーゆう上から目線はいくないと思うよ。 >>887
俺も昔は NetNews とかで痛い厨房だったけど、親切な上級者に諭されて目が醒めた。
だれだって慣れない内はちょっと痛い言動もあるし、上級者から見ればアホっぽい質問することだってあるさ。
何から手をつけていいからわかんないから答えをみながら考える、だって一概に間違いとは言えないだろう。

889:デフォルトの名無しさん
07/08/01 22:44:49
887が上からの目線とは思わんけど

890:デフォルトの名無しさん
07/08/01 22:48:21
むしろ>>888が上から目線

891:デフォルトの名無しさん
07/08/01 22:52:53
慣れないうちとかそういう問題じゃないと思うな今回の人は

892:デフォルトの名無しさん
07/08/01 23:07:55
「教育的回答をすればなんとかなるレベルの質問者じゃない」ってなんで決めつける?
とか思ったんだけど、まあ、すまんかったね。空気悪くする気はなかったんだ。黙っとくわ。

893:デフォルトの名無しさん
07/08/01 23:10:28
まあ放っておこう

はい次。

894:デフォルトの名無しさん
07/08/02 00:22:04
schemeそのものとあんまり関係ないかもしれんけどさ、
R6RS(正確にはR5.97RS)で追加されてる "mantissa width"ってなんのこと?
直訳すれば"仮数部長"あたりだと思うんだけど、何?
ぐぐってもよくわからんです

仕様を見るに、 "3.14 | 10" みたいに書くのかな?


895:デフォルトの名無しさん
07/08/02 01:25:29
>>894
単精度・倍精度のような実装依存の値ではなく、必要な桁数を要求して、
実装が単精度・倍精度を判断できるということでは?

896:デフォルトの名無しさん
07/08/02 01:32:00
>>894
R5.97RSのどこに書いてある?見つからんかった。
多分実数の印字表現の仕方の話なんだろうけど、
浮動小数点数の 仮数*基数^指数 の仮数の精度かな。
12345 = 0.12345*10^5 、これの0.12345に相当する部分の幅。

897:デフォルトの名無しさん
07/08/02 01:49:58
>>895

てか、schemeって、複素数とか妙に数値に細かいよな…

>>896
俺がさっき落としたPDFだと、13ページ左下
<ureal R> -> <uinteger R>
 | <uinteger R> / <uinteger R>
 | <decimal R> <mantissa width>

んで、<mantissa width>の定義は13ページ右上
<mantissa width> -> <empty>
 | | <digit 10>+


898:デフォルトの名無しさん
07/08/02 01:55:36
>>894
C言語で浮動小数点定数を
float f1 = 3.14f;
double f2 = 3.14;
とすると,バイナリで見たときf1とf2には別のデータが入るよね?
人間は浮動小数点定数のバイナリ表現を書くのが面倒だから "3.14" 等とだけ書いてコンパイラに変換させているわけだが
このときコンパイラに「IEEE single相当(仮数が23+1桁)の範囲で最良の3.14の近似を使ってくれ」 or
「IEEE double相当(仮数が52+1桁)の範囲で最良の3.14の近似を使ってくれ」と区別した指示を与えてることになる.
この一般化で,"3.14 | 10" は「ここの定数には,仮数が10桁の範囲で最良の3.14の近似を使ってくれ」と要求していることになる.
これは当然IEEE singleよりは桁が多いし,またIEEE doubleよりは桁が小さいので
普通に3.14と書いてデフォルトの52+1桁(以上)の数に変換させたときとは違う演算結果を得るだろうね.

Mathematicaやbc(1)のように浮動小数点数データの内部に「有効桁」という属性が含まれるようになる,という意味ではないよ.
ソースコード内の "3.14" などという文字列から処理系内部の数表現への,対応付けの厳密化だね.
指数表記にe, s, f, d, lの区別ができたり,ずいぶん細かくなったものだ.

>>896
R5.97RS 4.2.8 Numbers

899:894
07/08/02 03:05:51
細かい話だけど、>>898
> "3.14 | 10" は「ここの定数には,仮数が10桁の範囲で
> 最良の3.14の近似を使ってくれ」と要求していることになる.
って書いてるけど

R5.97RSの該当部分を読むと
Implementations that use binary floating-point representations
of real number objects should represent x|p using a
p-bit significand if practical, or by a greater precision if a
p-bit significand is not practical, or by the largest available
precision if p or more bits of significand are not practical
within the implementation.
ってことなので、仮数部の指定が"実装内で現実的で無い"場合は
それより大きい仮数部を持つ浮動小数点表現をすればOK、という風に
読めるけど違うかな?メモリ量を最適化しようとする実装に対して
仮数部の最低ビット数を指示するためにある、という風に俺は解釈するけど、
どうなんだろう?

言い換えると、小さい仮数部pが数値が指定されたときにわざわざdoubleから
落としてsingleにする必要性があるのかってことだけど。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch