QtとHaskell/VisualStudio
QtとHaskellは、どちらもソースコンパチブルでクロスプラットフォームの対応ができることから、実行環境について類似点があると思っています。またQtはC++、HaskellはFFI(Foreign Function Interface)によりC言語との親和性がとても高く、長年Cに慣れてきた自分にとって、この二つはとても肌に合う技術です。
JavaVMや.NET(Mono)の中間言語、Python等の軽量言語でクロスプラットフォーム開発をする方法もいいですが、Cでも古くない(やれることが新しい言語に負けていない)という点が魅力に感じます。
QtはUI、Haskellはロジックという使い方で、いろいろやってみたいことがあり、まず最初に、Hakellの関数の戻り値をQWebViewに表示してみることにしました。(WebViewに、ということは、JavaScriptとの連携ができることを意図しています。) QWebviewは以前「QtWebKit.QWebView を使ったPython、JavaScript連携」でテストしましたが、今度はQtがメインでVisualStudioでビルドしました。
環境
Glasgow Haskell Compiler, Version 7.6.3 stage 2 booted by GHC version 7.4.
Qt 5.1.1 for Windows 32-bit
qt-windows-opensource-5.1.1-msvc2010-x86-offline.exe
Visual Studio Add-in 1.2.2 for Qt5
qt-vs-addin-1.2.2-opensource.exe
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) void __stdcall HsBegin(void); __declspec(dllexport) void __stdcall HsEnd(void); __declspec(dllexport) long __stdcall adder(long x, long y); #ifdef __cplusplus } #endif MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->webView->load(QUrl("file:///c:/test.html")); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_1_clicked() { char buf[20]; HsBegin(); sprintf_s(buf, "adder : %d", adder(1,2)); HsEnd(); ui->webView->page()->mainFrame()->findFirstElement("body").appendInside(buf); }
Haskellコードは「Haskell from Excel」を参考にしてください。
プログラムを起動するとtest.htmlが読み込まれ、ボタンを押すと
エリアに演算結果が追加されます。実はこのプログラムは、いきなりVisualStudioで作成したのではなく、QtCreator 2.8.1(Baseed on Qt 5.1.1 MSVC 2010.32bit)で作成したものを、Qt5Add-Inを組み込んだVisualStudioで読み込みました。
Qt Creator
Visual Studio Add-in 1.2.2 for Qt5 (Open Qt Project File(.pro))
もちろんQt Creatorだけでも開発可能ですが、Add-InのテストをするためVSを使用しました。
Haskellをメインに、Qtを使うこともできるようですが、私の環境では、ghcで使われているmingwと、Qtで使われるmingwのバージョンが違うせいか、実行時にエラーとなりました。
なかなか思い通りになってくれないものですね。