パスワードを忘れた? アカウント作成
52738 journal

tuneoの日記: はじめてのErlang 2

日記 by tuneo

「Getting Started with Erlang」を読んでチュートリアルを動かしてるんですが……。

リストを「先頭の要素」と「残りの要素のリスト」に分割して末尾再帰でアレコレするのはLIPS、じゃなかったLISPとかのリスト処理業界では常識なんでしょうか?

当方は今までLISPその他とは無縁だったのでひいひい言ってます。

チュートリアルのコードはかろうじて読めるけど、自分で同じものを書けと言われたら自信がまったくありません(涙

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by visha (779) on 2009年01月28日 13時33分 (#1500811) 日記

    リストを先頭と残り(腰はcarとcdr)に分割して処理を進めていくのはLisperの常識なんですが、それを末尾再帰でやろうとするのはSchemerの常識でしょう。Common Lisperは概念的に再帰で書くべき場合以外は繰り返し構造を使いたがるようです。Schemerは繰り返しの代わりに末尾再帰を使うのが普通。外からは同じLisperに見えても、発想はかなり違ってる気がします。だから何だと言われても困りますが(笑)。

    わたしはSchemerですが、Common Lispも使います。Common Lisperから見ると、「コードがScheme臭い」そうです(笑)。

    • コメントありがとうございます。
      carとcdrに分割するのはLisp、末尾再帰で繰り返し処理はSchemeですか。参考になりました。

      Erlangのチュートリアルに載ってた例題では、リストの全要素を逆に並び替えたリストを作るコードで
      car/cdrと末尾再帰を使ってまして、初めて見るアプローチにカルチャーショックを受けてました。
      こんなの。

      get_reversed_list([List]) ->
        get_reversed_list(List, [])
       
      get_reversed_list([Head | Rest], Result) ->
        NewRes = [Head | Result],
        get_reversed_list(Rest, NewRes);
       
      get_reversed_list([], Result) ->
        Result.

      CやPythonで似たようなことをやってもスタックを浪費するだけですが、
      末尾再帰で繰り返し処理するErlangやSchemeだと「常識」なんですね。
      頭の使い方を変えないとダメだな、こりゃ……。

      親コメント
typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...