カリー料理

shibuya.lisp#3 へ行ってきた。久しぶりにshiroさんにお会いし、ご挨拶。次回は、LLTVの時かな?

TTは、相変わらず濃い話ばかりで、刺激的。印象に残ったのは、shiroさんの「天井の穴」。やはり、自分で触れる環境で無いと、天井に達した時、そこをつき破れる余地が 無いと、話にならん。ごもっとも。

後は、小黒さんの漫画の中で、「クダー」が、俺的には大うけ。cddddddr ぐらいでも 良かったかな。これだと、部外者には意味不明か。

宴会

こういう会議の後の宴会が実は一番の目的だったりします。今回も楽しかった。 初めて会う方が、RHGでお世話になっている会社の方だったりして、世間は狭いなあ と感じた次第。

ここでは書けないけど、Rxxx は、変態言語で、コードジェネレータをSchemeで 書く時、大変苦労した なんて話を聞いた。そうだよなあ。節操が無いよ。S式に 比べて。

私の席の正面に座っていた若い方が(名前失念)、「インドで死ね」なんて、言う事を 言ってたので、突っ込んで聞いてみた。日本で10人ぐらいしか使っていないであろう 言語のサークルへ入るためのキーワードとの事。

Curry

その言語とは、Curry . カリー化なら知ってるけど、ずばり カリーとは。 今使ってる(勉強中)の、Haskell と併せて、Haskell Curry.

なんでも、Prolog風味のHaskell との事。ソースから入れるのは難しいそうで、なかなか成功しないとか。面白そうだから、やってみよう。

材料調達

カリーを合い言葉に検索してみると、本物のカリーばかりがヒットして埓があかない。 haskell prolog を加えて、フィルターしてみたら、やっと本山が見えてきた。

A Truly Integrated Functional Logic Language

日本の支部はこちら。どんなのを入れるのが良いか調査した結果 The Portland Aachen Kielこれが、 お手頃そうだったので、試してみる事にした。

こういうのって、スーパーで、どんなカレーを買ってくるか悩むのと一緒で、エィヤァーで、決めるしかない。

Prologが要るので、portから入れて下準備完了。

調理開始

configした後、インストールしようとすると

[sakae@fb ~/pakcs]$ gmake install 
expr: syntax error
======================================================================
PAKCS installation configured with (saved in /home/sakae/.pakcsinitrc):
SICSTUSDIR=
SWIPROLOG=/usr/local/bin/pl
GHC=/usr/local/bin/ghc
======================================================================
gmake install 2>&1 | tee -a make.log
gmake[1]: ディレクトリ `/home/sakae/pakcs' に入ります
# install the mcc front-end if necessary:
gmake[2]: ディレクトリ `/home/sakae/pakcs/mccparser' に入ります
"Makefile", line 11: Need an operator
make: fatal errors encountered -- cannot continue
gmake[2]: *** [compile] エラー 1
gmake[2]: ディレクトリ `/home/sakae/pakcs/mccparser' から出ます
gmake[1]: *** [install] エラー 2
gmake[1]: ディレクトリ `/home/sakae/pakcs' から出ます
Make process logged in file make.log

makeが謎のエラーを吐く。mccparserに降りて行って、Makefileを読み、makeの気持ちに なって、

@cd $(HOGE_SRC) && ./testghc.sh && make

を、手うちで、実行。ここで、Haskellが顔を表し、小さいmccを作っている。これって、料理で言う、ルー作りですかね。大分時間がかかって、ルー完成。

メインのレシピに戻って、ルー作りを飛ばすようにMakefileを書き換え。再び料理開始。実行するにつれて、だんだん、Curryらしい雰囲気(pakcsのバナー表示)を出すようになってきた。でも、出来上がるまでは我慢我慢。

最後の、味付けは、gmake libdoc 、これ時間がかかりそうだったので、夜鍋にした。 今朝、出来上がりを確認してみたら

ERROR: Out of local stack
gmake[2]: *** [CategorizedHtmlList.html] エラー 1
gmake[2]: ディレクトリ `/home/sakae/pakcs/lib/CDOC' から出ます
gmake[1]: *** [doc] エラー 2
gmake[1]: ディレクトリ `/home/sakae/pakcs/lib' から出ます
Make libdoc process logged in file make.log

という事で、stack不足で、焦げ付いていましたよ。料理する時は、大きな鍋で実行しましょう。最近は、いろいろ窮屈する事があるので、大鍋が欲しいなぁ!

試食するぞ

[sakae@fb ~]$ pakcs
  ______      __       _    _    ______   _______
 |  __  |    /  \     | |  / /  |  ____| |  _____|   Portland Aachen Kiel
 | |  | |   / /\ \    | |_/ /   | |      | |_____    Curry System
 | |__| |  / /__\ \   |  _  |   | |      |_____  |
 |  ____| / ______ \  | | \ \   | |____   _____| |   Version 1.9.2 (1)
 |_|     /_/      \_\ |_|  \_\  |______| |_______|   June 2009

Curry2Prolog(swi 5.6) Compiler Environment (Version of 08/06/09)
(RWTH Aachen, CAU Kiel, Portland State University)

Bug reports: mh@informatik.uni-kiel.de

Type ":h" for help

何か、ghciの初画面と似てるなあ。取り敢えず味わい方は

Prelude> :h
Commands (can be abbreviated to a prefix if unique):
:load <prog>      - compile and load program "<prog>.curry" and all imports
:add <prog>       - add module <prog> to currently loaded modules
:reload           - recompile currently loaded modules
<expression>      - evaluate <expression> to normal form
let <var>=<exp>   - define variable binding for subsequent goals
:type <expr>      - show the type of <expression>
:analyze          - analyze program (see submenu)
:browse           - browse program and its imported modules
:interface        - show interface of current program
:interface <prog> - show interface of program "<prog>.curry"
:edit             - edit current program
:edit <file>      - edit file "<file>"
:modules          - show list of currently loaded modules
:show             - show source of currently loaded Curry program
:show <m>         - show source of module <m>
:show <f>         - show source code of function <f> in separate window
:programs         - show names of all Curry programs available in load path
:cd <dir>         - change current directory to <dir>
:!<command>       - execute <command> in shell
:save             - save current state to <prog>.state
:save <expr>      - save current state to <prog>.state with initial <expr>
:fork <expr>      - fork new process evaluating <expr> (of type "IO ()")
:coosy            - start Curry Object Observation System
:xml              - translate current program into XML format
:peval            - partially evaluate current program
:set <option>     - set a command line option
:set              - help on :set command
:help             - show this message
:quit             - leave the PAKCS environment

ふむふむ、ghciとは多少味付けが違うのね。面白そうな所で

Prelude> :programs
Curry programs available in the load path:
In directory ".":


In directory "/home/sakae/pakcs/lib":
AllSolutions Array Assertion CLPB CLPFD CLPR CPNS CSV CategorizedHtmlList Char Combinatorial DaVinci Database Dequeue Directory Distribution Dynamic FileGoodies FiniteMap Float GUI Global GraphInductive HTML HtmlCgi HtmlParser IO IOExts Integer JavaScript KeyDB KeyDatabase List Mail Maybe NamedSocket Parser PlProfileData Ports Prelude Pretty Profile PropertyFile Random Read ReadNumeric ReadShowTerm RedBlackTree SetRBT SetRBT0 Socket Sort System TableRBT TableRBT0 Time Tk Traversal URL Unsafe WUI WUIjs XML XmlConv

In directory "/home/sakae/pakcs/lib/meta":
AbsCurry AbsCurryIO AbstractCurry AbstractCurryPrinter CompactFlatCurry CurryStringClassifier Flat Flat2Fcy FlatCurry FlatCurryGoodies FlatCurryRead FlatCurryShow FlatCurryTools FlatCurryXML FlatTools FlatXML FlexRigid PrettyAbstract

へぇ、デフォで Tkが使えるっぽい

Prelude> :load Tk
Parsing 'Tk.curry'...
------------------------------------------------------------------------------
--- Library for GUI programming in Curry (based on Tcl/Tk).
--- <a href="http://www.informatik.uni-kiel.de/~mh/papers/PADL00.html">
--- This paper</a> contains a description of the basic ideas
--- behind this library.
---
--- @authors Michael Hanus, Bernd Brassel
--- @version November 2004
------------------------------------------------------------------------------
                                                                                module Tk(TkWidget(..),TkButton,TkConfigButton,
          TkTextEditScroll,TkCanvasScroll,TkEntryScroll,
          TkConfItem(..),TkCmd,TkConfigCmd,TkConfCollection(..),TkMenuItem(..),
          TkCanvasItem(..),TkRefType,
          runWidget,runWidgetInit,runWidgetPassive,
          runControlledWidget,runConfigControlledWidget,
            .....
Tk> :browse
Tk> Please be patient, reading all interfaces...
Reading FlatCurry files /home/sakae/pakcs/lib/.curry/Tk.fint /home/sakae/pakcs/lib/.curry/Ports.fint /home/sakae/pakcs/lib/.curry/Prelude.fint /home/sakae/pakcs/lib/.curry/Read.fint /home/sakae/pakcs/lib/.curry/Unsafe.fint /home/sakae/pakcs/lib/.curry/CPNS.fint /home/sakae/pakcs/lib/.curry/System.fint /home/sakae/pakcs/lib/.curry/Time.fint /home/sakae/pakcs/lib/.curry/Char.fint /home/sakae/pakcs/lib/.curry/Distribution.fint /home/sakae/pakcs/lib/.curry/IO.fint /home/sakae/pakcs/lib/.curry/List.fint /home/sakae/pakcs/lib/.curry/Profile.fint /home/sakae/pakcs/lib/.curry/ReadShowTerm.fint /home/sakae/pakcs/lib/.curry/Socket.fint /home/sakae/pakcs/lib/.curry/Global.fint /home/sakae/pakcs/lib/.curry/FileGoodies.fint /home/sakae/pakcs/lib/.curry/PropertyFile.fint /home/sakae/pakcs/lib/.curry/Directory.fint /home/sakae/pakcs/lib/.curry/Maybe.fint /home/sakae/pakcs/lib/.curry/IOExts.fint done

へぇー、Tkで書かれた、ソースブラザーが立ち上がってきたよ。面白いなあ。まるで、Pythonみたい。

もうちょっと味わう

Prelude> 3+4*5
Result: 23
More solutions? [Y(es)/n(o)/a(ll)] a
Prelude> 10 mod 3
ERROR: Type error in application: 10 mod
*** term           : 10
*** type           : Int
*** is not of functional type
Prelude> mod 10 3
Result: 1
More solutions? [Y(es)/n(o)/a(ll)] y
No more solutions.

なんとなくPrologっぽくて素敵。エラー表示もやさしそう。Haskellでは、

[sakae@fb ~]$ ghci
GHCi, version 6.8.3: http://www.haskell.org/ghc/  :? for help
Loading package base ... linking ... done.
Prelude> 10 mod 3

<interactive>:1:0:
    No instance for (Num ((a -> a -> a) -> t -> t1))
      arising from the literal `10' at <interactive>:1:0-7
    Possible fix:
      add an instance declaration for (Num ((a -> a -> a) -> t -> t1))
    In the expression: 10 mod 3
    In the definition of `it': it = 10 mod 3

ちょっと、とっつき憎いぞ。これから、もう少し味わってみますよ。なお、 Curry の教科書は こちらから