関数型言語Part IVat TECH
関数型言語Part IV - 暇つぶし2ch731:デフォルトの名無しさん
09/02/27 08:01:25
無ければ作るがヨロし

732:デフォルトの名無しさん
09/02/27 09:12:26
コンパイラ・スクリプトなんとかってのがあるぞ。

733:デフォルトの名無しさん
09/02/27 15:26:43
>>702の相手をしてくれそうなスレ

「コンパイラ・スクリプトエンジン」相談室13
スレリンク(tech板)

新C言語を作ろう
スレリンク(tech板)

いわゆる過疎スレ

734:デフォルトの名無しさん
09/02/27 15:33:36
コンパイラスレは実装技術のスレだから、言語設計の話はスレ違いだと思う

735:デフォルトの名無しさん
09/03/05 10:50:46
最近、Pythonを使っているんだけど、実行時に動的にごちゃごちゃ下品なことができるのが楽しい。
import 文でさえ、実行時に実行される文に過ぎないから、

try:
import hogehoge
config = hogehoge.config
except:
config = {...}

とか自由自在。これを関数にしちゃうこともできる。

こういうごちゃごちゃをやって、それで新しい文法を作り出せるのは面白い。
やっぱり、Lispを勉強するべきなのか。

736:デフォルトの名無しさん
09/03/05 18:17:46
>>735
> こういうごちゃごちゃをやって、それで新しい文法を作り出せるのは面白い。
これと
> やっぱり、Lispを勉強するべきなのか。
これの関連がPythonとLispを良く知らないオレにはよく解らない。

解説できたら求む。

737:デフォルトの名無しさん
09/03/05 19:12:11
>>736
たとえば、Python では、Cのinclude、Haskellのimportに相当するものとして、
import文というのがあって、次のように書く。

import time, re

でも、これは、CやHaskellと違って実行時に実行環境にアクセスする副作用のある関数のシンタックスシュガーで、

__import__('time')
__import__('re')

と書いているのと同じ。


だから、__import__関数をラップする関数を作って、自由な操作をすることができる。

my_import('foo')

そういうことやってどういううまみがあるのかといえば、ケースバイケースだろうけど、
オレはこういうトリックをアプリケーションの設定ファイルをライブラリのようにPythonコードでベタ書きした上、
コマンドライン引数で設定ファイルを指定できるようにしたりしている。

Lispはよく知らないんだけど、こういう自由度はLispが最強なのかなぁ、と。

738:デフォルトの名無しさん
09/03/05 19:50:30
>>737
Lisp以上の自由度のあるものはないかも。あれはS式だからこそ得られる自由度だからな。
だけどね。Lispを一通りやっておくと、そこで出ている考えかたや手法はPythonなどを使って
いくには良いヒントはある。

僕としてはできれば、そのままLispのハマって欲しい。(笑)
schemeとかは処理系次第だけど、useとか使ってるね。
Common Lispの場合もuse-packageだけど、大抵は、パッケージを使うときには、
(標準化されていないけど、最近は)asdfというパッケージでライブラリを管理してますね。
sbclならrequireで一発になってる。 基本はREPL環境なんで、思いついたときにすぐに
試せるのが強みかな。このへんはpython/rubyなどと同じ感覚だとおもう。Cとかjavaな
人には異質だろうな。関数言語ならインタプリターはあるから近いとおもうけどね。
インポートしちゃうんで、その辺は他と変わらんよ。

739:デフォルトの名無しさん
09/03/05 22:09:19
Schema(LISP?)のmap関数を覚えてから、Ruby でIteratorオブジェクトの
mapメソッドとその兄弟メソッドを猿のように使い始めた。
おかげで(副作用のある)ローカル変数をかなり削ることができて、
自分では保守性の良いコーディングになったと思ってる。
こんな感じ。

term_langs = MdTerm.new(
  TermType::LANGUAGES,
  :list => $language_strings_en.sort { |pair_x, pair_y| # ハッシュの値を基準にソート
    pair_x[1] <=> pair_y[1]
  }.map { |pair| # ハッシュのキーだけを取り出す
    pair[0]
  }
)

あとRubyもif/caseみたいな条件判定は式だから、上のブロック(クロージャ)内で使える。
たぶんCやPerl等しか知らない人からすると、気味の悪いコーディングに見えるんじゃないかな。
このスレの住人さん達からすればフーンなスタイルだと思うけど。

740:デフォルトの名無しさん
09/03/05 22:49:09
(>>739 続き)
さらにPrologでも、全解探索処理はバックトラックを利用した
Prologらしいスタイルだけど、取り出したリストの加工処理は
自作したmap系の述語(関数)を全面的に活用している。
結果として、プログラム全体の中でおよそ7割がmap系述語によるコーディングになってる。

get_importer_attr_use_importers(MdAttrName, UseImporterDict1) :-
  set_of_list( # 全解探索を実行
    [importer(Id, Name), ContentType], % 探索結果(=リストの要素)の形式を指定
    get_importer_attr_use_importer(MdAttrName, Id, Name, ContentType), % 探索述語を指定
    UseImporterTable # この変数に探索結果(リスト)が単一化される
  ),
  !,
  table_to_dict(UseImporterTable, UseImporterDict), % テーブルを辞書に変換
  map_list(UseImporterDict, sort_use_importer_ent, UseImporterDict1). % 辞書をソート
get_importer_attr_use_importers(_, []) :- !.

table_to_dict(Table, Dict) :-
  !,
  map_list(Table, list_to_head, Heads),   # テーブルの先頭(head)だけを取り出す
  reject_duplicates_list(Heads, Keys),    # 重複した要素(辞書のキー)を取り除く
  map_list(Keys, keys_to_dict(Table), Dict). # キーを元に辞書を作成

この短い例の中だけでも述語map_listを3回使っている。
map_list は第一引数を入力リスト、第三引数を出力リストとし、第二引数の述語を呼ぶ高階述語。
Prologにはクロージャの概念が無いから、対応する述語を定義しなければならない事がちょっとめんどくさい。


741:デフォルトの名無しさん
09/03/05 23:32:36
>>739
せっかくだから
$language_strings_en.sort_by(&:last).map(&:first)
と書こうぜ

742:デフォルトの名無しさん
09/03/07 10:16:42
どうでもいいけど Ruby にしろ Perl にしろ、記号
多すぎでゲロゲロだな

743:デフォルトの名無しさん
09/03/07 10:27:03
そしてHaskellには文句言わないんですね。わかります。

744:デフォルトの名無しさん
09/03/07 12:42:57
>>742
Perlは噂を聞いてplaggerのソースを見たけど、あれは綺麗だな。おそろしいソースが多いから
避けてたけどね。Perlは。

>>743
Haskellは。。。最初みたときは暗号解読してる感じだったな。宇宙語って印象だがあれはあれ
でハマる要素はあるわな。

745:デフォルトの名無しさん
09/03/07 12:54:18
むしろC, Haskell, Ruby, Perlあたり以外の言語が記号を使わなさ杉

746:デフォルトの名無しさん
09/03/07 13:03:46
>>745
common lispは使いたければ自分で定義しろだからな。。。
無くても不自由ではないしむしろ、自由度の秘訣。

747:デフォルトの名無しさん
09/03/08 00:21:20
自由とは責任のことだ。だから人は自由を恐れる。

748:デフォルトの名無しさん
09/03/08 13:06:27
Perlの記号は悪い記号
Haskellの記号は綺麗な記号

749:デフォルトの名無しさん
09/03/08 14:43:27
(.) (.) :: (a1 -> b -> c) -> a1 -> (a -> b) -> a -> c
Haskellのおっぱいは綺麗なおっぱい

750:デフォルトの名無しさん
09/03/08 14:50:31
λa b c d. a b (c d)

751:デフォルトの名無しさん
09/03/08 19:10:38
ほいよ。
--
gosh> (define (。人。) (print '巨乳))
。人。
gosh> (。人。)
巨乳
#<undef>
gosh>


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch