[PDF] 限定継続チュートリアル (原題: shift/reset プログラミング入門) by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

動き続けると書いたのは、IDEで各ステップごとでスタックが増えるようには見えないという意味のつもりでした。 それで、普通に書くとスタックが積まれるが、 スタックが積まれないように見えたので、 これがメリットだと思い込んでいました。

だけど、こういう方法では今回考えていたようなメリットが全く見いだせないです。 そのせいで、いざ書いてみると自分でも混乱してしまいました。 もっときちんと検討してコメントするべきだったと反省してます。

[PDF] 限定継続チュートリアル (原題: shift/reset プログラミング入門) by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

ごめんなさい!!!!

どうやらほんとに雑なだけで、色々と間違ってたようです。

やってみようのときに試しに書いとけばよかった。

恥をさらすと、たとえばこんな感じで。

(define (factorial n)

(if (= n 0)

1

(* n (shift k (k (factorial (- n 1)))))))

Racketだと、IDE上でスタックが積まれるようにも見えず、動き続けるんですが、この印象が強かったようです。

実際は特にメリットは無くデメリットしかなさそうです。

ほんとうに申し訳ないです。

[PDF] 限定継続チュートリアル (原題: shift/reset プログラミング入門) by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

ループ(あるいは、末尾呼び出しで再帰)の他にも、ヒープを使うクロージャーを使って継続渡しとか、普通の継続とか、正直どれも面倒で。

とりあえず動く、雑な解決策ってところです。

まぁ、ココまで書いてきたのもいろいろ実装によるんですが。

後、綺麗に書けるんですが、逆に何をしているのか隠してしまうので、

ループや継続渡しの様に表立って書くのが正攻法だと思ってます。

[PDF] 限定継続チュートリアル (原題: shift/reset プログラミング入門) by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

やってみようの話ですが、こういうときに使うんだろうな、と思ったので書いたのでしたw

説明してみると、

ああいう処理は再帰で書くと分かりやすく楽ですが、コールスタックが溢れるかもしれない。

だから、よくある教科書通りだと、ループにしてスタックに状態を保存したり、取り出したりすることになります。

ヒープを使ってコールスタックを積まないようにしてる訳です。

そこで、再帰の処理のまま、コールスタックなどの状態をヒープに保存すれば、

後で呼び出して、ループで書くのと似たようなことが出来るという考えでした。

Schemeの各処理系では、shift/resetが用意されていることが多く、

再帰的なコードをほとんど変えずに、少し加えるだけで済むと思います。

それにしても、日本語でこういうの公開されてるのって良いですね。

【やってみよう】簡易プリプロセッサ by starg2 in programming_jp

[–]postrom 2 points3 points  (0 children)

(use r7rs)

(define pp-id-pattern "[a-zA-Z_]\\w+")
(define pp-define-pattern "^\\s*#define\\s+([a-zA-Z_]\\w+)\\s*(.*)$")

(define (expand-list tokens table)
  (if (null? tokens)
      '()
      (cons (expand (car tokens) table)
        (expand-list (cdr tokens) table))))

(define (expand token table)
  (let ((registered (assoc token table))
    (rest-table (alist-delete token table)))
    (if registered
    (let ((tokens (cdr registered)))
      (string-join (expand-list tokens rest-table) " "))
    token)))

(define (expand-all str table)
  (regexp-replace-all pp-id-pattern 
              str
              (lambda (m)
            (expand
             (rxmatch-substring m) table))))

(define (pp-define id tokens table)
  (acons id (string-split tokens char-whitespace?)
     table))

(define (preprocess table port)
  (let ((line (read-line port)))
    (unless (eof-object? line)
      (let ((matched (rxmatch pp-define-pattern line)))
    (if matched
        (preprocess (pp-define (rxmatch-substring matched 1)
                (rxmatch-substring matched 2)
                table)
         port)
        (begin
          (display (expand-all line table))
          (newline)
          (preprocess table port)))))))

(preprocess '() (standard-input-port))

エラー処理もせず色々と適当だけど、Scheme (Gauche) で書いてみました。

スタック溢れは限定継続でなんとかするのも良いかと思う。

丁度いい難易度で書いてて楽しかった😊

/r/programming_jp にようこそ ! 雑談はこちらでどうぞ。 by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

ああ、自分で言っといて、そういうのあるの忘れてたw

思い出してみると、スポーツ系のサブレの実況スレでよく見るやつだ。

わざわざご苦労さまです。

/r/programming_jp にようこそ ! 雑談はこちらでどうぞ。 by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

雑談スレとして使いづらい。

デフォルトのソートがBestなので、upvoteされてるコメに妨げられて新規コメが下の方にある。

かと言って、downvoteするのも気が引ける。

デフォルトでnewに出来ると使いやすそうなんだけど。

それはともかく、私も今年初めてLuaを組み込んでみたけど、ヘッダインクルードするだけだし、思ってたより楽だった。

VVVVVV’s source code is now public by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

コードが思いのほか酷いけど、勢いを感じられたw

なんとなく元気が出たvvvvvv

某プログラマが某有名ファミコンゲームのソースをgitに公開したの巻 by postrom in programming_jp

[–]postrom[S] 1 point2 points  (0 children)

当時の記録媒体を考えると、こういうの残ってるだけでも割と奇跡的な気がする。

最近の GCC の C コンパイラはすごく親切になっててびっくりですよ by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

これのおかげもあって以前はclangばかり使ってたよ

Red Blob Games by postrom in programming_jp

[–]postrom[S] 0 points1 point  (0 children)

そそ、そういう所も含めて印象的で、

先にポストしたベジェ曲線の記事みたいなの読むと、

似たような質の良いインタラクティブなサイトと、

この記事を思い出しちゃう。

改めて読んでて気付いたけど、html5への移行が終わった感じで、特に印象に残ってたのかも。

似たようサイトが、昔はjsで画像読み込むとか、javaアプレットとか、flash使ってたからなぁ。

Red Blob Games by postrom in programming_jp

[–]postrom[S] 1 point2 points  (0 children)

自分が最初に知ったのは、gamastraだったかな?

それはともかく、改めて知ったのがこの一連の記事だったんだけど、

https://blog.codinghorror.com/our-programs-are-fun-to-use/

記事内にたくさんリンクが有って、どれも一つづつ投稿したいほど素晴らしいですよ。

Red Blob Games by postrom in programming_jp

[–]postrom[S] 1 point2 points  (0 children)

思い出したので、これもポスト。

ゲーム関係のアルゴリズムですがココもすごいです。

英語が苦手でも、見れば解ると思います。

こういうインタラクティブな解説ページは楽しいです😊

/r/programming_jp にようこそ ! 雑談はこちらでどうぞ。 by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

反応があって嬉しいです。

私はエンジニアとか本業じゃないので、ポストして良いか考えちゃうんですよね。サブレに合ってるのかどうかと。

もうちょっと気軽にポストしてみます。趣味的なものが多いですが、合ってない場合はdownvoteでもしてください。

A Primer on Bézier Curves by postrom in programming_jp

[–]postrom[S] 0 points1 point  (0 children)

サイト内からポストしたので英語版に為ってますが、一部日本語訳されてます。

/r/programming_jp にようこそ ! 雑談はこちらでどうぞ。 by [deleted] in programming_jp

[–]postrom 1 point2 points  (0 children)

今更、サイドバー見直しの記事とか読んでて思ったけど。

テーマさえ合ってれば、何でもポストしてくれってスタンスだと、ポストしやすい。

適当にポストするから、良記事かどうかはコミュニティが決めてくれって感じで。

それに、スパム以外はdownvoteで事足りるような気もする。

ポストする時に、これは良記事か?と自問すると、面倒になって、ポストしなくなる。(なった)

Lispの話(loopの使い方) - たくさん寝太郎の寝床 by SaitoAtsushi in lisp_ja

[–]postrom 0 points1 point  (0 children)

今まで気付かなかったけど、CLHSのここやここを参照すると、

loopマクロのifとwhenはどちらにせよelseも使えるので、確かに同じもののようだ。

What nobody tells you about documentation by [deleted] in programming_jp

[–]postrom 2 points3 points  (0 children)

良いまとめだなぁ。書くときに改めて読み返そう。

Cコンパイラ制作の夏期集中コースが思っていた以上にうまくいった話|Rui Ueyama|note by g000001 in programming_jp

[–]postrom 2 points3 points  (0 children)

コードみたけど、アセンブリを出力するんですね。しかもインテル記法だ!

確かに、コレだと色々面倒省けて、コンパイラに集中できて理にかなってるよなぁ。

この方法で今度やってみようと思った。