Lisp Scheme Part17
..
446:デフォルトの名無しさん
07/05/26 23:41:43
>>441
なんかスカスカで見た目にかっこわるい
447:デフォルトの名無しさん
07/05/27 00:39:40
>>441
python 以上にキモい……
448:デフォルトの名無しさん
07/05/27 15:07:27
なんかMLみたいになっちゃってるね。
449:デフォルトの名無しさん
07/05/27 16:33:48
これがそんなにキモイか?
define (fac x)
if (= x 0) 1
* x
fac (- x 1)
じゃあこうしよう
define (fac x)
{
if (= x 0)
{
1 (* x)
}
{
fac (- x 1)
}
}
450:デフォルトの名無しさん
07/05/27 16:40:56
K&R派なオレはそのifの書き方見るとイライラしてくるんだよねw
451:デフォルトの名無しさん
07/05/27 16:44:10
>>449
{ } の代わりに ( ) にしてみてもいいかも
452:デフォルトの名無しさん
07/05/27 16:47:59
>>449
どうでもいいが式が間違ってるぞ
まあ前者はインデントが浅すぎでキモく見えるだけじゃないのか?
453:デフォルトの名無しさん
07/05/27 16:52:20
インデント文法で一番有名なPythonは20年後はもう衰退していると思うが、
この手法はSchemeと一緒に30年後も生き残っていそう。
それで、インデント文法はSchemeが元ネタだ! と騒ぐ信者が出現
454:デフォルトの名無しさん
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))
こんな感じで
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5369日前に更新/220 KB
担当:undef