Lisp Scheme Part18 ..
[2ch|▼Menu]
552:デフォルトの名無しさん
07/11/08 23:42:14
最近勉強始めたんだけどschemeで作るプログラムのアーキテクチャが全然想像できない
オブジェクト指向だったらMMVCとかあるけどschemeでオブジェクト指向やってもうれしくもなんともないし

553:デフォルトの名無しさん
07/11/09 01:06:31
うれしくなければやらなければいい。

>>551
r5rs - 5.2.2 Interanal Definition

554:デフォルトの名無しさん
07/11/09 01:12:47
初心者で質問なんだけど、手続きが可変長引数を取るとき、
その全てを引数として他の可変長引数を取る手続きに渡すにはどうすれば良い?

(define (f1 . x)
x)
(define (f2 . x)
(f1 x))
(f2 1 2 3 4 5 6) ; ((1 2 3 4 5 6))になっちゃう(1 2 3 4 5 6)にしたい


555:デフォルトの名無しさん
07/11/09 01:20:39
(apply f1 x)

556:デフォルトの名無しさん
07/11/09 01:24:09
>>555
ありがとー

557:デフォルトの名無しさん
07/11/09 01:27:48
>>552
scheme とか lisp には言語を自由に拡張できるマクロが...
なので
> プログラムのアーキテクチャ
てなものを考えてもしょうがないと思うけど...

「特定の言語とかモデルに捕らわれないで問題領域解決用の専用言語を作る」
のが lisp 系言語の流儀だと思う.



558:デフォルトの名無しさん
07/11/09 01:38:39
Lisp : 粘土
Java : 煉瓦
Ruby : 絵の具

559:デフォルトの名無しさん
07/11/09 01:42:26
俺言語とかDSLを作らなくても最終目的に向かう途中で実行系自体がDSLみたいな状態になる。
プログラムを作るというより実行系の環境を最終目的物に書き換えていくみたいな感じ。

粘土細工作るときの作業台全体みたいな物だと思ってるんだけどどうなんだろう。


560:デフォルトの名無しさん
07/11/09 01:42:57
うわ、くだらねぇもの書いている間にシンプルなお答えが orz


561:デフォルトの名無しさん
07/11/09 02:20:03
その点、haskellとかocamlとかどー考えてんだろ

562:デフォルトの名無しさん
07/11/09 02:44:35
Haskell 実行する前に問題解決

563:デフォルトの名無しさん
07/11/09 07:59:36
>>551
出来る
けど内部定義のdefineだから
グローバルな束縛にならない

一方set!なら可視な束縛の変更だから
グローバルな環境の変更もできる

553がシンプルな答えだけど

564:デフォルトの名無しさん
07/11/09 08:42:26
>>563 の言うようにset!がシンプルだけど,
let環境の値としてinc, dec(を含むリスト)を返し,それを外部でinc, decで束縛すれば...

(define tmp
 (let1 count 0
  (define (inc) ...)
  (define (dec) ...)
  (list inc dec)))

(define inc (car tmp))
(define dec (cadr tmp))

;; 自分では動くか試してない(ぉ

565:デフォルトの名無しさん
07/11/09 10:18:36
それなら、defineせんでも、lambda式返せばいい。

566:546
07/11/09 12:24:49
>547
ありがとうございます

make sbcl-core
rm -f /home/hoge/.sbcl/sbcl.core-with-slime
sbcl <<EOF
This is SBCL 0.9.17, an implementation of ANSI Common Lisp.
More information about SBCL is available at <URLリンク(www.sbcl.org)

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (load "../src//slime-cvs/swank-loader.lisp")
load: not found
*** Error code 127

というメッセージが出ているので、makeの問題では無いと思うんですが…


567:デフォルトの名無しさん
07/11/09 12:35:36
Scheme も internal define なんて導入せず、それ以前の Lisp みたいに
define は top level をいじることにしとけばよかったのにな。
そうすれば begin の
5.1 Programs
> At the top level of a program (begin <form1> ...,) is equivalent
> to the sequence of expressions, definitions, and syntax
> definitions that form the body of the begin.
5.2.2 Internal definitions
> Wherever an internal definition may occur (begin <definition1>
> ...,) is equivalent to the sequence of definitions that form the
> body of the begin.
みたいな特別扱いも不要だし
(define x 10)
(define y x)
y => 10
(let ()
  (define x 10)
  (define y x)
  y) --> error
なんてわかりづらいこともなくなったのに。

568:デフォルトの名無しさん
07/11/09 14:36:31
beginのその特別扱いってなんであるんだ?
処理系書くとき邪魔だよねえ。

しかしdefineで内部関数を書けるのは便利。
labelsとかfsetとかは醜い。書きづらいし読みづらい。

569:デフォルトの名無しさん
07/11/09 15:16:43
二つ目の方が、
(begin <form1> ...)じゃないから、
(begin (begin <definition1> ...))を機械的に、
<definition1> ...とsplicingするわけにいかないのがきつい…

こっちはR6RSではないんでしょ。
・Internal definitions are now defined in term of letrec*.

トップレベルの方はライブラリがらみでまた気にするところ増えたけど。



570:デフォルトの名無しさん
07/11/09 15:48:37
(begin (begin <definition1> ...))が
(begin <definition1> ...)になって、次は、
<definition1> ...でいいんじゃないのかなあ?

その辺り、R6RSの方が解釈しやすい書き方だけど。
<body> <library body> <top-level body>と、
構文上のノンターミナル使って定義してあるから。
R5RSは文章での説明が多くて理解するのに頭を使う。



571:デフォルトの名無しさん
07/11/09 21:44:17
The Little Shemerを簡単じゃないかと思衣ながら読んでいたら、
8章の途中から泣きそうになった(高階関数のあたり)。

何とか理屈はわかったけれど、身に付くかどうか・・・
がんばってみます。


572:デフォルトの名無しさん
07/11/09 23:47:21
>>571
おお仲間だ!
multiremberEcoとかcontinuationとか出てきたあたりで学習速度がすっごいダウンするよね

573:デフォルトの名無しさん
07/11/10 00:50:26
The Little Shemerは、
曖昧に理解せず、身に付けさせるための本だから、
ちゃんと読み終わったら身に付くよ。

574:デフォルトの名無しさん
07/11/10 00:56:59
seasonedとかreasonedはどうだった?

575:デフォルトの名無しさん
07/11/10 12:38:29
lisp で並列分散処理プログラムを実際に書いている人は居ます?
どういった処理系もしくはライブラリを使ってますか?
やっぱりほとんどいないのかな。。

576:デフォルトの名無しさん
07/11/10 12:57:24
3行目があるせいで釣りにしか見えん。

577:575
07/11/10 13:40:41
まじめに自分もその環境でコーディングしたいと考えています。
並列プログラミングの話ってほとんど語られていないと思ったんで。

578:デフォルトの名無しさん
07/11/10 14:08:27
Erlisp は期待してたんだけど、どうなったのだろう

579:デフォルトの名無しさん
07/11/10 14:09:17
cmlisp とか, *lispとかの話かい???



580:デフォルトの名無しさん
07/11/10 14:36:44
CL のライブラリだよ

581:デフォルトの名無しさん
07/11/10 22:16:14
アナルlisp?

582:デフォルトの名無しさん
07/11/11 00:04:04
Schemeの入門はLittle Schemerしかないのかな。
手習いや湯浅先生の入門本は入手しづらいし。

583:デフォルトの名無しさん
07/11/11 02:55:56
あなりすぷ・・・

584:デフォルトの名無しさん
07/11/11 12:23:59
(cons 'ちんぽ 'アナル)

585:デフォルトの名無しさん
07/11/12 07:54:12
`(ちんぽ . アナル)

586:デフォルトの名無しさん
07/11/12 09:50:01
Python実装だけど並列処理の記述はLispでやる予定の俺がいますよ


587:デフォルトの名無しさん
07/11/12 22:13:04
みんなschemeの処理系なに使ってんの?
みんな自作?

588:デフォルトの名無しさん
07/11/12 22:21:59
ごうしゅをつかってまつ

589:デフォルトの名無しさん
07/11/12 22:49:07
Gauche 時々 MIT

590:デフォルトの名無しさん
07/11/12 23:10:25
587 じゃないけど...

MIT 使ってる人は初めてだ。もし良かったら、
どんな時に Gauche じゃなくて MIT を使うか
教えて下さい。

591:デフォルトの名無しさん
07/11/12 23:26:12
MITしか入ってない環境で作業するとき・・・。

592:591
07/11/12 23:50:57
職場で借りてるファイルサーバになぜか入ってて時々使ってるって程度の話ね。

593:デフォルトの名無しさん
07/11/12 23:58:55
多くのディストリとかcygwinに、わりとデフォで入っているという理由で guile を使うことがある

594:デフォルトの名無しさん
07/11/13 00:16:13
>>591,592
どうもありがとう。何か拘りがあって使ってらっしゃるのかと思いました。

595:デフォルトの名無しさん
07/11/13 00:46:26
>>587
slang

596:デフォルトの名無しさん
07/11/13 01:25:24
リストの中からある要素を探して、その要素の前にあるオブジェクトを破壊的に挿入する
にはどうしたらいいでしょう。例えば、3 の前に 'a を挿入したいです。
(let ((x 3))
(let ((ls (list 1 2 3 4 5)))
;; ここ
ls))
=>(1 2 'a 3 4 5)


597:デフォルトの名無しさん
07/11/13 02:27:53
俺初心者で悪いけど、こういうこと?

(define (find-insert lst fnd val)
(define (find-cdr lst f)
(if (equal? (cadr lst) f)
lst
(find-cdr (cdr lst) f)))
(let ((l (find-cdr lst fnd)))
(set! (cdr l) (cons val (cdr l)))))

(define ls '(1 2 3 4 5))
(define x 3)
(find-insert ls x 'a)
(write ls)

598:デフォルトの名無しさん
07/11/13 04:01:03
>>597
お付き合いいただいてどうもです。ヒントになりました。
setf を使えば良かったみたいです。3 の後になってしまいますが、
次善の策としてこれでも良いです。
(let ((x 3))
(let ((ls (list 1 2 3 4 5)))
(let ((place (member x ls)))
(setf (cdr place) (cons 'a (cdr place))))
ls))
=>(1 2 3 a 4 5)

599:デフォルトの名無しさん
07/11/13 12:00:26
>>587
俺はPLTだな…IDEが付いてくるからって理由だけだが。

600:デフォルトの名無しさん
07/11/13 12:14:47
gaucheとscm。
scmはdefaultでreadlineがあるからちょこちょこ書くときはこっち。

601:デフォルトの名無しさん
07/11/13 18:00:34
scheme48(とguile)
有理数が使えていろんな環境で使えるのはこれくらいしかない(と思う)
ocsなんかも面白そうだけどまだあんまり使ったことない

602:デフォルトの名無しさん
07/11/13 18:05:51
一度どれか使っちゃうと、
独自仕様部分のポーティングが面倒になる。

603:デフォルトの名無しさん
07/11/13 18:51:27
つまりスキームなんてどれも使うな、コモンリスプ最強ってことか?

604:デフォルトの名無しさん
07/11/13 20:17:53
>>603
Common Lispの処理系が動かない環境もあるんでつ(´・ω・`)

605:デフォルトの名無しさん
07/11/14 01:05:28
どんな環境?

606:デフォルトの名無しさん
07/11/14 06:55:03
zaurus-openbsdとか

607:デフォルトの名無しさん
07/11/14 13:22:12
clispくらい動きそうだけどな

608:デフォルトの名無しさん
07/11/14 13:58:42
つPalmOS

609:デフォルトの名無しさん
07/11/14 18:19:10
>>607
動きそうだけど動かないですねぇ
clispもGCLもGaucheもMzSchemeもGambit-Cも

Gambit-Cはビルドは成功するけどリーダがいかれてて
3 -> 0
8 -> unbound error
とかになります
ソースが機械翻訳のCだから追う気になれないけど
規則性のあるバグだから見つかればつぶせそうです

scheme48は依存ライブラリもなく、GCも多倍長計算も有理数も自前なのにi386 onlyでポーティングされてるのが疑問
だから自分でパッケージ作っていれてます

610:デフォルトの名無しさん
07/11/15 15:48:16
Linuxならi386以外にもportされてるけどな
URLリンク(packages.debian.org)

611:デフォルトの名無しさん
07/11/16 01:12:44
というかzaurusなら普通にscheme48のパッケージが流通しているわけであるが。

感度の悪いアンテナ持ってるやつってどうよ?

612:デフォルトの名無しさん
07/11/16 06:53:05
>>611
zaurus-"OpenBSD"の話です
i386のみにportingされているのは事実です
i386じゃなくても動くのも事実ですけどね

613:デフォルトの名無しさん
07/11/16 07:42:01
好きで使っているOSへの愚痴は、そのOSの板でやってくれ。

614:デフォルトの名無しさん
07/11/16 23:20:53
そう、ここは好きじゃないのに使わされている OS への愚痴を書き込む場所です

615:デフォルトの名無しさん
07/11/16 23:48:10
好きでも嫌いでもないOSの愚痴はどこに書き込んでもいいです

616:デフォルトの名無しさん
07/11/16 23:51:51
押忍

617:デフォルトの名無しさん
07/11/16 23:58:29
OCS ってこれか。

URLリンク(will.iki.fi)

618:デフォルトの名無しさん
07/11/17 01:17:35
御意

619:デフォルトの名無しさん
07/11/20 13:14:54
>>600
ledit使えばいいんじゃね? > readline

$ ledit gosh -i

$ alias gau='ledit gosh -i'してる。

620:デフォルトの名無しさん
07/11/20 15:57:12
SECDR-Schemeってソース見てみたいんだけど、誰か持ってない?
テンプレのリンクは切れてて見れませんでしたわ。

621:デフォルトの名無しさん
07/11/20 23:48:16
以前ダウンロードしたときはリンク切れから適当にURLを推定して当てた記憶があるですよ。

622:デフォルトの名無しさん
07/11/21 10:39:21
だから、そのダウンロードしたソースを持ってないでしょうか?
って聞いてるんだわ。(^〜^)

623:デフォルトの名無しさん
07/11/21 10:49:39

             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 持ってるが lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ

624:デフォルトの名無しさん
07/11/23 13:49:48
CommonLispやSchemeでは、
2個以上の引数を取るandやorはマクロで定義されている様なんですが、
関数を使っても定義できるはずです。
なぜマクロを使っているのでしょうか。

625:デフォルトの名無しさん
07/11/23 14:01:08
無駄な評価をふせげるから。

626:デフォルトの名無しさん
07/11/23 14:02:36
そんで、大昔は、特殊形式でやる流儀もあったけど、
今はマクロで済むことはマクロでやる流儀。

627:デフォルトの名無しさん
07/11/23 14:39:20
誰かfranzセミナー行った人、内容教えて

628:624
07/11/23 14:55:37
>625
関数だと引数をみんな評価してしまうけど、
マクロならしないってことですか?

>626
すいません
特殊形式とマクロの違いがよくわかってないんですが、
引数を関数とは違う順序で評価するという点で同じで、
そのうち特殊形式はプリミティブなものと言うような理解で
いいんでしょうか。



629:デフォルトの名無しさん
07/11/23 15:32:46
>>628
andもorも、「左から見ていって、途中でオシマイという運びになったらその後ろは評価しない」ものでしょ?
でも関数は「まずすべての引数を評価する」機構なわけで、それではandもorも実現できない。
一方、マクロは引数をまったく評価しない。だからこれを使って定義されている。

特殊形式は、すべての引数を評価するとは限らない関数、みたいなもので、
想像の通り、プリミティブなものだ。

てかこの辺り、Lispの勉強の初日や二日目の範疇じゃないか?

630:デフォルトの名無しさん
07/11/23 22:22:56
遅延評価を導入すれば関数として統一的に定義じゃないかという吊りかも

631:デフォルトの名無しさん
07/11/24 09:36:14
脳内のイメージが遅延評価な人なのかもしれん。Haskell でも試してみたら?

632:デフォルトの名無しさん
07/11/24 11:00:01
>>628
なんのために書籍の「ON LISP」があると思っているのか

633:デフォルトの名無しさん
07/11/24 11:28:27
賢い人を更に教育するため。

私たちにとっては,On Lisp でレベルアップして,
更にいろいろ教えてくれる様になったその人たちに
より突っ込んだを質問が出来るようになる。だな。

634:デフォルトの名無しさん
07/11/24 13:54:45
初心者はANSI Common Lispがいいよ。On Lispはちょっと応用すぎる。
あとはEmacs Lisp Tutorialとかも参考になるだろうね。

635:デフォルトの名無しさん
07/11/24 14:04:06
Scheme→Common Lispだと拒否しちゃいそうだけど
Common Lisp→Schemeだと使い分けられそう。

636:デフォルトの名無しさん
07/11/24 14:08:24
プラットフォームがBlackboardならScheme、それ以外ならCommon Lisp。

637:デフォルトの名無しさん
07/11/24 15:35:48
引数の評価についてはSICPでも超序盤で触れてるね

638:デフォルトの名無しさん
07/11/24 16:42:39
>>633のような輩に無料で教えるほど賢い人は暇ではないだろうな

639:624
07/11/24 22:13:01
>629
>andもorも、「左から見ていって、途中でオシマイという運びになったらその後ろは評価しない」ものでしょ?
なるほど、単なる論理演算かと思ってました
ありがとうございます

>630,631
最近Haskellをかじって
うはwwwマクロもういらねんじゃね?www
とかいって喜んでたんですが、やっぱりそれであってるんですね

640:デフォルトの名無しさん
07/11/25 02:35:01
>>115-128 あたりで同じやりとりをした気がするけど、遅延評価でも関数じゃ setq とかが書けないんで、マクロは必要。

641:デフォルトの名無しさん
07/11/25 03:53:03
マクロがあってもスペシャルフォームは書けないはずだけど。

642:デフォルトの名無しさん
07/11/25 10:05:48
setq って quote して set するだけだと思ってたけど、他に何かしてたっけ?

643:デフォルトの名無しさん
07/11/25 13:39:38
遅延評価でquoteが書けるか?

644:デフォルトの名無しさん
07/11/25 16:05:00
>>642
説得してる

645:デフォルトの名無しさん
07/11/25 16:12:29
>>642
それだと(多くの処理系では)グローバルしかセットできない

646:デフォルトの名無しさん
07/11/25 17:16:37
なるほど。
# 普段 ELisp しか使ってないから、 set するだけだと思ってた。

じゃ、 case とかが書けないからマクロは必要、に訂正かな。

647:デフォルトの名無しさん
07/11/27 01:33:45
>>635
SchemeとXyzzyLispって俺はどうすれば…。

648:デフォルトの名無しさん
07/11/27 02:05:34
どうしようもないね

649:デフォルトの名無しさん
07/11/27 03:29:28
>>635
俺は逆だなぁ、CLだとなんでも揃うのだけどSchemeだと原理主義ありきなんで妥協してくれないから。


650:デフォルトの名無しさん
07/11/27 11:05:23
原理主義ってどんなの?
「プリミティブがあれば充分」論者はR6RSで少なくなっていくと思う。
moduleとかOOとか。

651:デフォルトの名無しさん
07/11/27 11:21:24
じゃあ、さっさと R6RS を実装しやがれ

652:デフォルトの名無しさん
07/11/27 11:33:55
あんなR6RSを正直に完全実装するのがでてくるかな?
リファレンス実装以外で。

653:デフォルトの名無しさん
07/11/27 11:38:14
今のメジャーな処理系が実装するというよりは、新しい処理系で R6RS 準拠ってのが出てきそうな気がする

654:デフォルトの名無しさん
07/11/27 11:57:18
SchemeのC++0xやー

655:デフォルトの名無しさん
07/11/27 17:28:37
個人的にはR5RSにリードマクロとsyntax-caseと{read,write}-byteとfile-seekとsystemと環境を明に操作する手段とimplicit forceとfull numeric towerとFFIさえあれば良いだけなんだけどなぁ
実装してる処理系はあるけど標準化されてないってのがネック
UTF-8ファイルの読み書きで1バイト読み込むのか1文字読み込むのか実装依存(1文字読み込む実装は知らないけど)だし

構文オブジェクトもファーストクラスにして
(define foo (syntax ...なんて構文で定義したり
applyの第1引数に構文オブジェクトを受け取るように出来たらいいのに
でもそうすると構文木解釈系でしか動かないだろうから相当遅くなるし
そもそも合成構文はevalされる前に展開されるから無理か

ただCLと違って値も関数もdefineで定義できるのに
構文定義だけdefine-syntaxってのが美しくない気がする
define-syntaxは処理系に対して、defineは実行系に対しての構文だと割り切るしか無いか

656:デフォルトの名無しさん
07/11/27 19:57:37
そういえば以前PCLの翻訳が進んでるって話題でてたけどどうなったんだろう。
中止になったのなら半分まで進めて止まってる翻訳再開しようかな・・・

657:デフォルトの名無しさん
07/11/27 22:43:16
>>656 あなたは「RHG読書会」というお告げが聞こえたような気がした --more--

658:デフォルトの名無しさん
07/11/28 11:59:24
>>656
Lisp関係の書籍出している出版社に問い合わせてみては?
既に進んでいるなら、翻訳者陣に参加して加速してくださいw

659:デフォルトの名無しさん
07/11/29 16:42:48
>655
ハゲド
ごちゃごちゃしたいならCLに行けば良いんだから
schemeは原理主義的な性格を守っていってほしい

構文オブジェクトは普通のマクロ入れると
コンパイラのコード生成ルールを吐いてくれるように出来ないかな?
ほんとに動的なマクロだと無理だろうけど...

660:デフォルトの名無しさん
07/12/06 13:58:46
continuation の挙動について理解できていない点があり,
以下のような 2 種類の Scheme コードを書いてみました.

;;; case-A ----------------------------------------
(define continuation-A #f)
(define procedure
(lambda (n)
(define counter-A n)
(call-with-current-continuation
(lambda (k)
(set! continuation-A k)
(write counter-A) (newline)
)
)
(set! counter-A (+ counter-A 1))
(write counter-A) (newline)
)
)

(procedure 0) ; ==> 0 と 1 が表示される
(continuation-A #t) ; ==> 2 が表示される
(continuation-A #t) ; ==> 3 が表示される
(continuation-A #t) ; ==> 4 が表示される

;;; case-A おわり

661:660
07/12/06 14:00:00
;;; case-B ----------------------------------------
(define continuation-B #f)
(do ((counter-B 0 (+ counter-B 1)))
((= counter-B 10) 'finished)
(if (= counter-B 5) (call-with-current-continuation (lambda (k) (set! continuation-B k))))
(write counter-B) (newline))
; ==> 1 2 3 ... 7 8 9 finished が表示される

;;プログラム実行部
(continuation-B #t) ; ==> 5 6 7 8 9 finished が表示される
(continuation-B #t) ; ==> 5 6 7 8 9 finished が表示される
(continuation-B #t) ; ==> 5 6 7 8 9 finished が表示される

;;; case-Bおわり

662:660
07/12/06 14:02:18
case-A では
continuation-A が生成されたときから変数 counter-A が
ずっと見えたままであり,
continuation-A の呼び出しごとに counter-A の束縛値が
1 ずつインクリメントされていく.
(continuation-A が呼ばれるたびに,
「continuation-A 生成時における counter-A の束縛値」である 0 に
いちいちリセットされることはない.)

case-B では
continuation-B が呼ばれるたびに counter-B の束縛値は
「continuation-B 生成時の counter-B の束縛値」である 5 に
リセットされる.

多分基本的なところが理解できていないのだと思いますが,
この 2 つのコードにおける continuation 上の変数の見えかたについて
なぜこのような違いが生ずるか,お教えいただければ助かります.

663:デフォルトの名無しさん
07/12/06 15:14:39
わざわざdoなんか使うから話が余計ややこしくなってる。
doを再帰に展開してごらん。

664:デフォルトの名無しさん
07/12/06 15:14:49
doは再帰だから。
doのdefine-syntaxがR5RSに書いてあるから読んでみたらどうよ?
束縛環境を良く考えると分かるはず。↓while版

(define continuation-B #f)
(let ((counter-B 0))
(while (< counter-B 10)
(if (= counter-B 5)
(call-with-current-continuation (lambda (k) (set! continuation-B k))))
(write counter-B)
(write-char #\ )
(inc! counter-B))
(print 'finished))
(continuation-B #t)
(continuation-B #t)
(continuation-B #t)


665:デフォルトの名無しさん
07/12/06 15:15:39
do は counter-B の値を破壊的に書き換えてない。
新しい環境作って、そこで同じ名前に別の値を束縛してるだけ。
だから元の場所に戻ると、そこの環境にはそのときの値が残ってるから、その値が参照される。

set! は破壊的に書き換えるから、元の値が残ってない。

666:デフォルトの名無しさん
07/12/07 04:31:10
Clojure試してるんだけどClassCastExceptionばかりで使い物になんないよ……
どうなってんのこれ。

667:デフォルトの名無しさん
07/12/07 20:01:29
clusure じゃないの?って検索してみたら…

java スレ行け。

668:デフォルトの名無しさん
07/12/07 20:02:20
× clusure
○ closure

669:デフォルトの名無しさん
07/12/08 01:05:55
>>666 作ってるよーという話がでたばかりの言語に安定性を期待しすぎなんじゃないの?

670:デフォルトの名無しさん
07/12/08 02:36:47
Clojureは広い意味でのLISPっぽさがあっていいんじゃないの?

671:デフォルトの名無しさん
07/12/08 08:02:24
一般的なLispとの違いがまとめてあるけど、
URLリンク(clojure.sourceforge.net)
どう考えてもLispでしょ。

Haskell方面で良く使われているSTM、
それにreactive Agent使った並列Lispの一種で面白いと思う。
STMでいろいろ遊んでみたかったんで試してみます。>>666サンクス

>>667みたいな馬鹿はなんなんだろ。

672:デフォルトの名無しさん
07/12/08 09:36:17
java で書かれたなんらかの言語の実装系に問題があるなら
なんらかの言語は無関係と思うが?
ClassCastException って java の例外でそ?

673:デフォルトの名無しさん
07/12/08 09:39:16
661=671乙

javaで書かれた何かの言語の処理の実装系に問題があるなら
その何かの言語よりjavaに通じた人に質問する方が効果あると思うが?

ClassCastException は java の例外でしょ?

674:デフォルトの名無しさん
07/12/08 09:43:08
と考えたが、Cで書かれたschemeの処理系に問題があった場合、
C使いだけでなくschemerに聞くのも有りか…

javaグラマに偏見あるな俺は

675:671
07/12/08 10:12:13
>>673
>>664は俺なんだけど何で分かったの!びっくり!
と思ったら>>661 orz

>>666の間違いかよ!

676:673
07/12/08 10:52:39
>> 675

誤りについては御寛恕賜りたく、

677:デフォルトの名無しさん
07/12/08 12:54:42
>>674
あるみたいだね

678:デフォルトの名無しさん
07/12/08 13:17:21
最初はJDK1,7のクロージャの実装がまだバグが多くて愚痴った内容を誤爆していたのかと思った。
JVMの上で動くClojureというLISP処理系の話とは思わなかった。

679:デフォルトの名無しさん
07/12/08 13:53:24
>>671
>>>667みたいな馬鹿はなんなんだろ。

2ch だからといって安直に馬鹿とかアホとか書くのは止めた方が良いよ。

680:デフォルトの名無しさん
07/12/08 14:20:34
ポメラニアンファック! ヽ(`Д´)ノ

681:デフォルトの名無しさん
07/12/09 04:58:51
>>679
書いた本人が安直な馬鹿だから、言ってもしょうがない。

682:デフォルトの名無しさん
07/12/09 19:56:01
>>666
ClassCastExceptionなんていうJavaの例外が出てる時点で、処理系の不具合だろうが。
不具合あるなら、ソース読むか、コミュニティに報告するかだろ。
それができないんだったら、安定版がリリースするまでおとなしく黙ってろ。

683:デフォルトの名無しさん
07/12/10 01:39:04
>不具合あるなら、ソース読むか、コミュニティに報告するか
あるいは愚痴を言う、だろ?

そのキツい態度はこのスレに取って良い未来を生み出さないと思うのだが。


684:デフォルトの名無しさん
07/12/10 04:00:09
>>683
その優しい態度も良い未来を生み出さないという意味では同じであろう。
つまり、好きにそれぞれの芸風でやってくれ。w

685:デフォルトの名無しさん
07/12/10 08:09:12
俺は優しくしているつもりはない。
ただフレームを生み出すよりは無視する方がまだマシだというお馴染みの主張をしたいだけで


686:デフォルトの名無しさん
07/12/11 10:12:56
R6RSなんかより、MS謹製のLisp#に期待だなぁ。
強力なIDEの付いたVisual Lisp# 2008出してくれないかな。。

687:デフォルトの名無しさん
07/12/11 10:22:16
俺は型付き Lisp が欲しいな。勿論型推論込みで。

688:デフォルトの名無しさん
07/12/11 12:00:24
インタープリタで型推論とか出来るんだろうか

689:デフォルトの名無しさん
07/12/11 12:44:23
hugsとかやってるじゃん

690:デフォルトの名無しさん
07/12/11 19:11:27
>>686
どんなMS独自仕様が拡張されているの?

691:デフォルトの名無しさん
07/12/11 21:02:04
OCamlなんかもインタプリタで型推論してますね

ところでScheme48でscmファイルからモジュールを,openする方法ってないんでしょうか?
モジュールを,openしたヒープイメージを,dumpか,buildする方法だとなんか大げさだし
標準入力で,openさせて-a batchする方法だと標準入力が塞がっちゃうし
(open structure-name)とかで,openできればいいんですけど…

692:デフォルトの名無しさん
07/12/11 21:59:56
>>690
.NET Framework をシームレスに呼べるようになってたりするのだろう。w
それはそれで便利かも。

693:デフォルトの名無しさん
07/12/11 22:16:56
F#ですか

694:デフォルトの名無しさん
07/12/11 22:33:57
MSによりLisp#が開発される暁には、.net frameworkを呼べるようになるだけではなく、
Java→C#で行われたような言語レベルでの大幅な強化・改善が行われるだろう。

695:デフォルトの名無しさん
07/12/11 22:38:10
丸括弧が無くなるんじゃねーの

696:デフォルトの名無しさん
07/12/12 00:55:36
あの会社としては、CLtLとかRxRSなんて気にしないで新標準を作っちゃうんだろうけど、
それでも依然として LISP ではあるところが LISP の包容力の大きさだ。w
まじでやってほしい気がしてきた。

697:デフォルトの名無しさん
07/12/12 10:45:55
lispであるための条件って
表現がS式であることしか無いような気がしてきた

698:デフォルトの名無しさん
07/12/12 16:29:24
M式の立場は?

699:デフォルトの名無しさん
07/12/12 17:06:11
SM式?

700:デフォルトの名無しさん
07/12/12 20:24:54
665で1文字読み込む実装は知らないなんて書きましたけど
無知すぎました
エンコーディングさえ設定すれば1文字読み込むことも出来る実装がちゃんとあるんですね

701:デフォルトの名無しさん
07/12/13 09:49:24
>>695
( ) の代わりに全部 { } で書くの?

702:デフォルトの名無しさん
07/12/13 17:35:11
>>700
>665で1文字読み込む実装は知らないなんて書きましたけど

665にはそんな記述見あたらないんだけど…
655の間違いだな

703:デフォルトの名無しさん
07/12/13 22:19:54
>>695
dylanのことかーっ

704:691
07/12/14 01:07:29
slib/scheme48.initに答えが書いてありますねorz
slibはscheme48を冷遇してるから期待してなかったんですが…

705:700
07/12/14 20:29:02
>>702
訂正どうもです

706:デフォルトの名無しさん
07/12/14 23:11:54
『Gaucheプログラミング』

Kahuaプロジェクト 著
川合 史朗 監修
ISBN978-4-87311-348-7
定価3,360円

707:デフォルトの名無しさん
07/12/14 23:50:51
>>706
発売日は決まったの?

708:デフォルトの名無しさん
07/12/15 07:58:50
>>706
「プログラミングGauche」じゃなかったっけ?


709:デフォルトの名無しさん
07/12/15 08:43:01
「プロGaucheグラミング」

710:デフォルトの名無しさん
07/12/15 08:46:56
「プGロaグuラcミhンeグ」

711:デフォルトの名無しさん
07/12/15 08:50:12
それが出たら終了だな

712:デフォルトの名無しさん
07/12/15 09:29:05
「プログラミング」

   ∩___∩
   | ノ       ヽ
  /  ●   ● | G、Gauche!
  |  ///( _●_)//ミ
 彡、  /⌒)(⌒ヽノ
  ./  /  / \ \
  l   ノ    `ー‐'


713:デフォルトの名無しさん
07/12/15 12:14:48
ガウチェ

714:デフォルトの名無しさん
07/12/15 17:26:12
assqとassocはeqとequalの違いがあると本に書いてありました。
でも、どんな場合に違いがでるのかわからないので説明があるどこかのURLを教えてください。
お願いします。

715:デフォルトの名無しさん
07/12/15 17:49:32
>>714
eqとequalの違いは判る人?
それすら判らない人?

716:デフォルトの名無しさん
07/12/15 17:50:56
>>714
URLリンク(www.google.co.jp)

717:デフォルトの名無しさん
07/12/15 18:35:24
>>714
"Comparator"の違い。

718:デフォルトの名無しさん
07/12/15 18:37:57
>>715
わかりません。

>>716
やってみましたが下記のような感じで書いてあり、いまいち初心者にはピンと来ないのです。

eq
二つのオブジェクト(実体)が同じものの時。
実体が同じということは、その内容が変われば、他方の内容もそれにつれて変わるような関係。
シンボルや、整数値の場合は、名前や値が同じだけで同じと判別する。
equal
中身が同じものを指しているなら真。

719:デフォルトの名無しさん
07/12/15 18:49:29
>>714
一致する場合はこう。

(assq 'a '((a b) (c d))) ; => (a b)
(assoc 'a '((a b) (c d))) ; => (a b)

違いは以下のような場合。実行してみるとこういう違いがある。

(assq '(4 5) '(((1 2) 3) ((4 5) 6))) ; => #f
(assoc '(4 5) '(((1 2) 3) ((4 5) 6))) ; => ((4 5) 6)

>>718の説明から理解するのは難しい。

720:デフォルトの名無しさん
07/12/15 18:50:39
>>718
Javaの == と equals との関係に似ている
eq はポインタ同値

721:デフォルトの名無しさん
07/12/15 18:59:02
>>718は変。
eq
< 二つの引数が同じオブジェクトなら真。
equal
< 二つの引数が別のオブジェクトでも中身が同じなら真。

722:デフォルトの名無しさん
07/12/15 19:09:49
>>718
うるさいことを言わなければ、は以下のような使い分けになる。

・シンボルであることが明らかな場合は eq を使うことができる。(eqのほうが速い)
・そうでないときは equal が安全。
・その中間として eql ってのがある。構造のあるもの(リスト・文字列・配列など)でないことが
判っていればこちらのほうが速い。
・数値同士だと判ってるなら =、文字列同士なら string= がたぶん速い。

なぜこんなことになってるか知りたければもっと勉強するべし。

723:デフォルトの名無しさん
07/12/15 19:10:00
>>719-721
ありがとうございます。すごくよくわかりました。
(assq '(4 5) '(((1 2) 3) ((4 5) 6))) ; => #f
(assoc '(4 5) '(((1 2) 3) ((4 5) 6))) ; => ((4 5) 6)
の場合には(4 5)が別々のオブジェクトをさすポインタだからeqでは偽になるんですね。
でもequalだとオブジェクトが同じだから真になるんですね。

724:デフォルトの名無しさん
07/12/15 19:19:45
>>718
assqの実装は大体こんな感じになっている。

(defun assq (key alist)
(cond
((null alist) nil)
((eq key (car (car alist))) (car alist))
(t (assq key (cdr alist)))))

assocならこう

(defun assoc (key alist)
(cond
((null alist) nil)
((equal key (car (car alist))) (car alist))
(t (assq key (cdr alist)))))

>>724が言うようにeqlや=やstring=を使えば用途に応じて高速なものが使える。

725:デフォルトの名無しさん
07/12/15 19:25:35
>>723
> でもequalだとオブジェクトが同じだから真になるんですね。
< でもequalだとオブジェクトの中身が同じだから真になるんですね。


726:デフォルトの名無しさん
07/12/15 19:34:35
>>722>>724>>725
ありがとうございます。

>>722
むずかしいけど、>>724の解説をみて、使うと便利だということは理解できました (^ ^;

>>724
そういうプログラムなんですね。eqとequalの使われてるところとか参考になりました。

>>725
ありがとうございます。そういうことを書いたつもりでした。でもプログラミングのことを正確に話し言葉にするのって難しいです。

727:デフォルトの名無しさん
07/12/15 20:32:28
例えばここにSBCLのeq, eql, equalのソースがある
URLリンク(sbcl.cvs.sourceforge.net)
> 196 ;;;; equality predicates
eqの実質的な定義はちょっと見つけられなかったけど...

728:デフォルトの名無しさん
07/12/15 20:36:48
>>424
最後の行が間違えてるね。assq=>assoc

(defun assoc (key alist)
(cond
((null alist) nil)
((equal key (car (car alist))) (car alist))
(t (assoc key (cdr alist)))))

729:デフォルトの名無しさん
07/12/15 21:54:45
(defun sqrt (x)
(defun good-enough? (guess)
(< (abs (- (square guess) x)) 0.001))
(defun improve (guess)
(average guess (/ x guess)))
(defun sqrt-iter (guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))

(defun average (a b) (/ (+ a b) 2))

(defun square (x) (* x x))

(sqrt 2)
1.414216

730:デフォルトの名無しさん
07/12/15 22:14:28
随分と荒い収束判定だな

731:デフォルトの名無しさん
07/12/15 22:27:49
>>730
どこを修正すると改善されるか?という問題かな?

732:デフォルトの名無しさん
07/12/15 22:35:11
無理せず Scheme 使えば…… define と defun は違うよ。とオモタ

733:デフォルトの名無しさん
07/12/16 00:54:38
>>732
Schemeを使わなくてもCLにはlabelsがあるよ。とオモタ

734:デフォルトの名無しさん
07/12/16 01:38:25
>>727
「実質的な」ってどういう意味?

735:デフォルトの名無しさん
07/12/16 12:26:37
自問自答w

翻訳系eq実装の事ね。
src/compiler/x86/pred.lisp

eqlは、
src/compiler/x86/arith.lisp
src/compiler/x86/float.lisp
src/compiler/src/trans.lisp
あたり。



736:デフォルトの名無しさん
07/12/17 02:31:46
jmuk(笑) Haskell(笑)

737:デフォルトの名無しさん
07/12/17 23:35:02
今日の発見

(atom '(1 2 3)) ; => nil
(atom (quote ())) ;=> t

空リストがアトムだと知らなかった。 orz

738:デフォルトの名無しさん
07/12/17 23:39:40
(listp '())
t

リストでもある

739:デフォルトの名無しさん
07/12/17 23:58:26
(defun . (atom . ((x . nil) . ((not . ((consp . (x . nil))))))))

740:デフォルトの名無しさん
07/12/18 01:01:57
CLなら()はquoteしなくてもいいんじゃなかったっけ?
Schemeならquoteがいるけど
Guileは()も#(...)も自己評価的でRnRSとはだいぶ違う(Schemeの中ではCL寄り?)
R5RSに準拠してくれたら乗り換えてもいいかなと思うんだけど

741:デフォルトの名無しさん
07/12/18 02:14:52
>>737
nilって知ってる?

742:デフォルトの名無しさん
07/12/18 08:44:38
(atomp '下條) => t

743:デフォルトの名無しさん
07/12/18 12:32:51
(atomp '鉄腕) => t

744:デフォルトの名無しさん
07/12/18 16:01:08
(atomp 'フランツ) => t
あれ?

745:デフォルトの名無しさん
07/12/18 18:48:24
てか、atomp でいいの?

746:デフォルトの名無しさん
07/12/18 20:13:30
>>738
listpとか

(null ())
t

とかも教科書では出てくるけどatomはあまり使わないかな。記号処理では使うけど。



747:デフォルトの名無しさん
07/12/18 20:46:24
>>745

ホントは良くない。

748:デフォルトの名無しさん
07/12/19 14:15:26
Common Lisp:
(let ((x)) x) => NIL
Scheme:
(let ((x)) x) -> ERROR
Unspecific値が返るかと密かに期待したんですけど
CLと違ってSchemeではletはlambdaの派生式だから当然と言えば当然ですね
Unspecific値を手軽に得るには(if #f #f)しかないのかな?

749:デフォルトの名無しさん
07/12/20 00:22:39
>>728
Scheme版ならこんな感じ。

(define assoc
(lambda (key alist)
(cond ((null alist) nil)
((equal key (car (car alist))) (car alist))
(else (assoc key (cdr alist))))))

lambdaとelseを使ってみた。

750:デフォルトの名無しさん
07/12/20 00:26:32
SchemeかLispで書いてあるアルゴリズムの教科書を教えてください。

751:デフォルトの名無しさん
07/12/20 01:28:38
>>748
Schemeの文法良く調べろよ。

752:デフォルトの名無しさん
07/12/20 04:05:38
(define assoc
 (lambda (key alist)
  (cond ((null? alist)
       #f)
      ((equal? key (caar alist)))
       (car alist))
      (else
       (assoc key (cdr alist))))))

753:デフォルトの名無しさん
07/12/20 17:54:21
>>752
乙!
null?だよね。間違ってたw
あとcaarの方が簡潔だね。

754:デフォルトの名無しさん
07/12/20 17:55:22
>>751
文法はアルゴリズムじゃないぜw

755:デフォルトの名無しさん
07/12/20 17:57:38
>>754
アルゴリズムの話なんてしてないだろw

756:デフォルトの名無しさん
07/12/20 18:00:54
>>750
釣りかもしれないけどSICPとかどうよ?

757:デフォルトの名無しさん
07/12/20 18:03:46
>>755
はぁ?

>750 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 00:26:32
>SchemeかLispで書いてあるアルゴリズムの教科書を教えてください。
>
>
>751 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 01:28:38
>>>748
>Schemeの文法良く調べろよ。
>
>754 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 17:55:22
>>>751
>文法はアルゴリズムじゃないぜw
>
>
>755 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 17:57:38
>>>754
>アルゴリズムの話なんてしてないだろw

アルゴリズムの話じゃなきゃなんなの?

758:デフォルトの名無しさん
07/12/20 18:30:18
これは新手の荒しか?







759:デフォルトの名無しさん
07/12/20 18:34:33
     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧
 (; ´Д`))' ))(・∀・ ;)
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(

アンカーをもう一度見直すんだ

760:デフォルトの名無しさん
07/12/20 18:58:27
>>759
わはー、おっちょこちょいはワシだけじゃなかったらすぃ


761:デフォルトの名無しさん
07/12/20 18:58:29
>>754 が勘違いしたってことでいいのか?


762:デフォルトの名無しさん
07/12/20 20:15:05
Lisp/Schemeでセジウィックみたいなアルゴリズムの本って思いつかないな?
SICPは良い本だけど辞書的ではないしなぁ。

763:デフォルトの名無しさん
07/12/20 21:05:07
>>752

(define (assoc key alist)
 (and alist
  (let loop ((ls alist))
   (if (equal? key (caar ls))
    (car ls)
     (loop (cdr ls))))))


764:デフォルトの名無しさん
07/12/20 21:10:53
関数型という範疇であればアルゴリズムの本はあるよ。MLだけど。

Purely Functional Data Structures

Algorithms: A Functional Programming Approach

765:デフォルトの名無しさん
07/12/20 22:08:20
>>749さんのは動かなかったので修正しておきました。
(define assoc
(lambda (key alist)
(cond
((null? alist) #f)
((equal? key (car (car alist))) (car alist))
(else (assoc key (cdr alist))))))

>>752さんのも動かなかったので修正しておきました。
(define assoc
(lambda (key alist)
(cond
((null? alist) #f)
((equal? key (caar alist)) (car alist))
(else (assoc key (cdr alist))))))

>>763さんのは動きました。loopの使い方がイイ感じですね。

766:デフォルトの名無しさん
07/12/20 23:38:07
Lispで

(setq pref-alist
'(("山梨県" . "甲府市")
("神奈川県" . "横浜市")
("愛知県" . "名古屋市")
("茨城県" . "水戸市")))

とやっているのをschemeではどのように書けばよいのでしょうか?お願いします。

767:デフォルトの名無しさん
07/12/20 23:40:38
トップレベルなら setq を define にするだけだべ

768:デフォルトの名無しさん
07/12/21 00:06:44
>>767
gaucheでそうやってみると

gosh> *** READ-ERROR: Read error at "c:/meadow/test-assoc.scm":line 43: EOF encountered in a string literal: "壤壤壤「壤ィ"
Stack Trace:

となるので間違っているのかと思いまして。日本語が上手く通っていないだけなんですね。ちょっとがっかりですが納得できました。有り難うございます。

769:デフォルトの名無しさん
07/12/21 00:15:17
英語で

(define pref-alist
'(("yamanashi" . "kofu")
("kanagawa" . "yokohama")
("aichi" . "nagoya")
("ibaraki" . "mito")))

と書いて、
>

c-c c-l ファイル名
したあと

>gosh> (assoc "ibaraki" pref-alist)
("ibaraki" . "mito")

と出来ました。お騒がせしました。utf-8が上手く行ってないようです。

770:デフォルトの名無しさん
07/12/21 00:24:35
c-x return f utf-8 return
してからセーブしたら解決しました。
Gaucheの仕様がコンソール上ではsjisでOKなのに、ファイルだとutf-8しか受け付けないというのがわかっていなかったのが原因でした。

771:デフォルトの名無しさん
07/12/21 00:46:35
>>748
> (let ((x)) x) -> ERROR

これはletの返り値じゃなくて、文法エラーだぜ。
初期値省略は許されてない!



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

5096日前に更新/189 KB
担当:undef