スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++0xで、関数の戻り値の型を2回書かずに済む方法 その2

こんなのを書いてみた。

namespace detail {
template<typename... A>
struct unnamed_ctor_impl;
template<>
struct unnamed_ctor_impl<> {
  template<typename T>
  operator T() const {
    return T();
  }
  template<typename T, typename... B>
  static T apply(B&&... b) {
    return T(std::forward<B>(b)...);
  }
};
template<typename A0, typename... A>
struct unnamed_ctor_impl<A0, A...> {
private:
  A0&& a0;
  unnamed_ctor_impl<A...> rest;
public:
  unnamed_ctor_impl(A0&& a0, A&&... a) : a0(a0), rest(a...) {}
  template<typename T>
  operator T() const {
    return apply<T>();
  }
  template<typename T, typename... B>
  T apply(B&&... b) const {
    return rest.template apply<T>(std::forward<B>(b)..., std::forward<A0>(a0));
  }
};
} // namespace detail

template<typename... A> inline detail::unnamed_ctor_impl<A...>
unnamed_ctor(A&&... a) {
  return detail::unnamed_ctor_impl<A...>(a...);
}

使用例

template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
  return unnamed_ctor(x);
}
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

C++0xで、関数の戻り値の型を2回書かずに済む方法

戻り値の型がメタ関数とかの結果で、そのまま書くとすごく長いことがある。

template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
  return typename hogehoge<typename piyopiyo<T>::result_type>::type(x); // 同じ型名を書いている
}

decltypeを使えば1回で済む。

template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
  return decltype(some_function(x))(x);
}

テーマ : プログラミング | ジャンル : コンピュータ

Lua 5.2.0 (work1)の雑感

思ったこと。

  • C関数から呼び出したLua関数からyieldできるようにする関係で、多少複雑になってしまった感じがする。出来なかったことが出来るようになった代償か。
  • バージョン(luaL_checkversion)は、本当に必要だろうか。バージョンが違ってたらそもそも実行できるのかという疑問が。
  • lua_cpcallの代用が面倒。1行のコードが4行に。ただしポインタ以外のものも渡せるのはいいかもしれない。
  • 非互換が多過ぎる。しかも互換オプションはデフォルトで無効な上に、LUA_GLOBALSINDEXのように跡形もなく消えたものもある。

もちろん、これは最初の作業バージョンだから、正式リリースまでには全く違うものになっているだろう。非互換が多過ぎると書いたけど、互換オプションがデフォルトになる見込みは十分にある。

しかしLua 5.1 (work0)が2004年3月で5.1の正式リリースが2006年2月。 Lua 4.1のスナップショットが2001年5月、Lua 5.0 (work0)が2002年6月で5.0の正式リリースが2003年4月。 ということは正式リリースはまだまだ先だな。

まとめ:今から心配したってしょうがない。でもできるだけ追い続けていよう。

テーマ : プログラミング | ジャンル : コンピュータ

Lua 5.2.0 (work 1) が公開された

Lua 5.2.0の作業バージョンが公開された。
MLの投稿:[ANN] Lua 5.2.0 (work1) now available

変更点などは自分で確認しよう。以下は(ほんの)一部。

  • 言語
    • in-do-end (Lexical Environments)
      みんなで使いどころを考えてやりましょう。
      in {myprint=print} do
      myprint("Hello world")
      end
      
      要はsetfenvでやっていたことの代替。そしてさようならget/setfenv。
    • \xHH
  • ライブラリ
    • setfenv/getfenvの廃止
    • ビット演算
    • table.packの追加
    • unpackはtable.unpackに移動
    • debugライブラリはrequire()でロードしてね
  • CのAPI
    多過ぎな気がするので書きません。

テーマ : プログラミング | ジャンル : コンピュータ

JavaScriptのパーサを製作中

前に書いたように、JavaScriptにはブロックスコープがない。 JavaScript 1.7にはlet文というのがあるのだが、今の時点ではただの独自拡張だ。Mozilla系以外のブラウザでは動かない。 それなら、let文を使ったコードを、前に書いたような方法(function(){}()で包む)で、どのブラウザでも動くようなコードに変換すればいい。

というわけで今はJavaScriptのコードのパーサを書いている。しかしAutomatic Semicolon Insertionがめんどくさい。

これが完成すればlet以外の機能(Expression closuresのような、純粋なシンタックスシュガーの類)も実装したい。

テーマ : プログラミング | ジャンル : コンピュータ

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。