Lisp Scheme Part17 ..
[2ch|▼Menu]
369:デフォルトの名無しさん
07/05/20 01:29:55
自覚て。俺 (367) も同一人物ってこと?

370:デフォルトの名無しさん
07/05/20 05:25:04
香ばしい展開

371:デフォルトの名無しさん
07/05/20 09:20:54
まぁこういうアホな会話を育ててしまうという経験を積んでいくうちに
「あれ、どうやら俺は、自分で思っていたほど賢くないみたいだぞ?」
っていうのを学んでいくんですよ。

一生「会話がアホになったのは俺と違って相手がバカだから」の一点張りで生き続けるのも
たまに居ますが。

372:デフォルトの名無しさん
07/05/20 14:01:12
>>369
バレてないつもりなのか
>>367にもそのレスにもまだ特定できるほどの特徴が残ってるんだよ

373:デフォルトの名無しさん
07/05/20 14:28:42
ここで Ruby スレみたいな話をするのは止めておくれ

374:デフォルトの名無しさん
07/05/20 14:44:53
>>373
そりゃ駄目だよ
こういう馬鹿がRubyスレとか他のスレで暴れる前に釘を刺しておかないと

お前の事だけどな

375:デフォルトの名無しさん
07/05/20 14:48:14
>>372の後でも特定されるようなレスをするのはわざとなんだろうか
第三者のなりきりかな?

376:デフォルトの名無しさん
07/05/20 14:51:32
そこまで執着する理由が分からんけど、何かトラウマでもあるの?

377:デフォルトの名無しさん
07/05/20 14:54:25
>>375
もしかして自分が間違ってるかもと思ったら、それが正解だよ。
これ、俺からのアドバイスね。

378:デフォルトの名無しさん
07/05/20 15:11:51
それはチョンの陰謀

379:デフォルトの名無しさん
07/05/20 15:50:01
>>352 に引用されてるやつは元レスの荒らしが酷いからRubyスレ住人がキレたんだろ。
なんでそんなに特定したがってんだ??

689
CommonLisp が実用的じゃないって Ruby 厨はどれだけアホなんだw
で、Gauche の方が実用的だって?
Shiro 氏自身が実用で使うなら Gauche より CommonLisp とるって言っているのにwwww

702
SBCLで仕事しようとするからだろ
アホか

714
>>710は真性のアホだなw


380:デフォルトの名無しさん
07/05/20 15:58:09
>>379
こんな見え見えの釣り針に>>352って小学生同士の喧嘩か

381:デフォルトの名無しさん
07/05/20 16:01:00
>>379
「特定したがってる」んじゃなくて、
別人を装って>>352に引用されてる奴を擁護してるからお前に突っ込んでるんだよw

382:デフォルトの名無しさん
07/05/20 16:03:13


  こ

 ち

   ぬ


383:デフォルトの名無しさん
07/05/20 16:04:36
なんでこのスレ定期的に炎上するの?w

384:デフォルトの名無しさん
07/05/20 16:07:07
ところで君たちは何をそんなにムキになってるのかね?
Ruby スレがどうしたとかなんとか、そんなにムキになるほどの
ことなのかね?
そもそも何を怒ってるんだ君たちは?

385:デフォルトの名無しさん
07/05/20 17:02:31
本人キター

386:デフォルトの名無しさん
07/05/20 18:07:02
\(^o^)/オワタ
URLリンク(www.unsymmetry.org)

387:デフォルトの名無しさん
07/05/20 18:26:41
>>386
すごい勢いだな。

388:デフォルトの名無しさん
07/05/20 18:28:43
>>386
実は奥の二人の方がが、手前の人よりも重要なんだよね(;゚∀゚)=3

389:デフォルトの名無しさん
07/05/20 18:39:58
なんで乳をそんなとこから出してんの? 不思議!

390:デフォルトの名無しさん
07/05/20 20:30:42
GaucheNight前
Lisp実装時の疑問に答えるスレ

GaucheNight後
GaucheNightの記事でLispを知ったLL信者に答えるスレ


391:デフォルトの名無しさん
07/05/20 21:04:45
ここはRuby支配下ですか?
他の言語は完全に支配下に置いたんですけどねぇ・・・

392:デフォルトの名無しさん
07/05/20 21:07:38
なんか痛いのがきた

393:デフォルトの名無しさん
07/05/20 22:51:04
>>379
というかこれ自体は別に嘘言ってないよなあ
ライブラリが少ないから実用的じゃないみたいなツッコミに
商用パッケージ使わないからと言っているだけだし
相手が小学生みたいな反応に見える

394:デフォルトの名無しさん
07/05/21 03:31:13
>>391
グレアムおじちゃんがお口にλつけて仕舞いにくるぞ


395:デフォルトの名無しさん
07/05/21 05:51:37
「支配」っていうのは、とてもRuby的な概念だよね。
自己顕示欲ともPerlコンプレックスともつかない、Rubyユーザーの野望がよく出てる単語というか。
とても人間的。

Lispはどっちかというと「わかる奴だけ使う最強兵器」みたいな位置だし、
ユーザーもそういう位置で満たされてるから、言語トーク自体を楽しむ意気込みはあっても、
そこで支配というワードが来ると、それどーゆー意味だったっけ的な溝を感じる。

396:デフォルトの名無しさん
07/05/21 10:51:46
ふーん

397:デフォルトの名無しさん
07/05/21 14:13:14
「最強兵器」も「支配」といい勝負ではないか?

398:デフォルトの名無しさん
07/05/21 14:41:11
頭悪そう

399:デフォルトの名無しさん
07/05/21 14:46:33
「支配」っていうのは、とてもボールペン的な概念だよね。
自己顕示欲とも万年筆コンプレックスともつかない、ボールペンユーザーの野望がよく出てる単語というか。
とても人間的。

筆ペンはどっちかというと「わかる奴だけ使う最強兵器」みたいな位置だし、
ユーザーもそういう位置で満たされてるから、筆記用具トーク自体を楽しむ意気込みはあっても、
そこで支配というワードが来ると、それどーゆー意味だったっけ的な溝を感じる。


400:デフォルトの名無しさん
07/05/21 15:31:15
Schemeは毛筆、と。メモメモφ(・∀・)

401:デフォルトの名無しさん
07/05/21 16:34:30
鉛筆最強

402:デフォルトの名無しさん
07/05/21 18:35:45
schemeはチョークじゃなかったっけ

403:デフォルトの名無しさん
07/05/21 18:45:51
メモメモφ(・∀・)
 smalltalk (n.) [smo?to?k]] 1.文房具談義、筆記用具トーク 2. 小型のチョーク (→数奇夢)

404:デフォルトの名無しさん
07/05/21 19:55:41
Ruby信者はいつも元気だな

405:デフォルトの名無しさん
07/05/21 21:18:17
Common Lispは山羊の毛の毛筆
Schemeは馬の尾の毛だな

406:デフォルトの名無しさん
07/05/21 21:46:39
>>405
どう違うの?

407:デフォルトの名無しさん
07/05/21 21:55:05
山羊の毛は(()())で
馬の尾の毛は(().())

408:デフォルトの名無しさん
07/05/21 21:58:49
俺様Lispはあそこの毛で作りました

409:デフォルトの名無しさん
07/05/21 22:04:42

 )

 )

410:デフォルトの名無しさん
07/05/21 22:18:54

 )

 )


411:デフォルトの名無しさん
07/05/21 22:19:36
λ
(())

412:デフォルトの名無しさん
07/05/22 12:48:02
黒板偉大なり

413:デフォルトの名無しさん
07/05/22 14:22:56
今、ウェブ・サービスの多くが、
Javaや.NETベースのアプリケーションサーバや、
Perl/Ruby/PHP/Python等のLightweight Languageの上に構築されていますが、
なぜそこにLispが含まれていないのでしょうか?

414:デフォルトの名無しさん
07/05/22 14:36:04
これはひどい一本釣りですね

415:デフォルトの名無しさん
07/05/22 18:42:36
(lambda

416:デフォルトの名無しさん
07/05/22 20:08:35
らんぶだ!

417:デフォルトの名無しさん
07/05/22 21:07:15
lambda! と申したか
酷い仕様だな

418:デフォルトの名無しさん
07/05/22 21:42:35
(lambada () '石井明美)

419:デフォルトの名無しさん
07/05/22 22:03:47
>>418
それはラマダン!

420:デフォルトの名無しさん
07/05/22 22:04:44
>>419
むしろラバンバ。

421:デフォルトの名無しさん
07/05/22 22:09:05
lamborghini

422:デフォルトの名無しさん
07/05/22 23:21:41
俺ははじめてlambdaを見たとき
ふつーにランバダってよんでたな。

423:デフォルトの名無しさん
07/05/23 00:36:40
俺は脳内でラムブダとつぶやきながら書いてる。

424:デフォルトの名無しさん
07/05/23 01:01:47
馬鹿が多くてちょっとほっとした

425:デフォルトの名無しさん
07/05/23 02:13:32
ホッとするのは底なしに危険だぜ

426:デフォルトの名無しさん
07/05/23 02:22:37
底なしなど幻想だ

427:デフォルトの名無しさん
07/05/23 05:59:23
「実質的に無限」というのは「有限」という意味だからね。
なんかこう、Lisperは特にそう考えたがりそうだね。

428:デフォルトの名無しさん
07/05/24 20:48:16
lispは見なす事が自然と身に付く
それができない頭硬いバカチンに使いこなすのは無理

429:デフォルトの名無しさん
07/05/24 22:21:39
迷惑だから Ruby スレで暴れているヤツ引き取ってくれ

430:デフォルトの名無しさん
07/05/24 22:26:26
実際そうしたい

431:デフォルトの名無しさん
07/05/24 22:31:47
>>429
暴れてるのはお前だろ

432:デフォルトの名無しさん
07/05/24 23:26:53
そもそも「引き取る」という概念がおかしいな。
スレッドと訪問者の関係を、チームと選手の関係みたいに思ってるんじゃないのか。

433:デフォルトの名無しさん
07/05/24 23:30:54
ゴミはGCへ

434:デフォルトの名無しさん
07/05/24 23:42:04
クロージャー体操
はっじまっるよーーーーーー

435:デフォルトの名無しさん
07/05/26 08:24:50
>>428
>...バチカンに使いこなすのは無理 に見えた。
言語論争の次は宗教論争かと思った。

436:デフォルトの名無しさん
07/05/26 09:10:00
オーソドックスなネタですね。


437:デフォルトの名無しさん
07/05/26 09:22:46
ウェブ技術系のブログを見ると、
「やっぱPHP最強だわ」などの表現が見当たりますが、
Lispはどうなのでしょうか。

438:デフォルトの名無しさん
07/05/26 09:50:39
括弧の数なら負ける気がしないぜ!

439:デフォルトの名無しさん
07/05/26 10:06:29
少しはカッコを減らす努力をしないと
ポール・グレアムに嘲笑われるぞ

440:ジュリー
07/05/26 10:14:38
勝手にしやがれ( ゜∀゜)

441:デフォルトの名無しさん
07/05/26 13:00:49
>>438-439
URLリンク(srfi.schemers.org)

442:ジュリー
07/05/26 13:03:34
♪せめて〜 少しはカッコ付けさせてくれ〜

443:デフォルトの名無しさん
07/05/26 21:50:17
>>441
それめっちゃ気持ち悪い。dylan? やっぱりかっこがいい。
かっこいいの!

444:デフォルトの名無しさん
07/05/26 22:10:11
>>442 藁。

445:デフォルトの名無しさん
07/05/26 22:33:45
curlってどうなったの?

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)




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

5370日前に更新/220 KB
担当:undef