jats-ug / ATS-Postiats

ATS2公式ドキュメント翻訳リポジトリ(translate_jaブランチ)
www.ats-lang.org
Other
2 stars 3 forks source link

Part.I Ch.5 「多相関数」の、stringはboxedなの? #7

Closed murasesyuka closed 9 years ago

murasesyuka commented 9 years ago

以下リンクのサンプルのコピペで、下記エラー。

ドキュメントには下記説明があるので、stringがboxedであることを期待しているようですが、現状のstringはunboxed?

もし型 T1 と T2 が与えられ #stacode("swap_boxed") をタプル型 (T1, T2) に対して呼び出した場合、T1
と T2 はボックス化されていなければなりません。

https://github.com/jats-ug/ATS-Postiats/blob/translate_ja/doc/BOOK/INT2PROGINATS/CHAP_POLYMORPH/main.atxt#L369...L380

以下versionで、

$ patsopt --version
ATS/Postiats version 0.2.0 with Copyright (c) 2011-2015 Hongwei Xi

下のサンプルコードをコンパイルすると

#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"

fun swap_boxed{a,b:type} (xy: (a, b)): (b, a) = (xy.1, xy.0)

val AB = ( "A", "B" )
val BA1 = swap_boxed{string,string} (AB)

implement main0 () = ()

下記コンパイルエラーとなりました。

$ patscc -DATS_MEMALLOC_LIBC temp.dats 
In file included from temp_dats.c:15:0:
temp_dats.c: In function ‘_057_home_057_murase_057_syakyou_057_Introduction_to_Programming_in_ATS_057_temp_056_dats__dynload’:
temp_dats.c:378:21: error: incompatible type for argument 1 of ‘swap_boxed_0’
 ATSINSmove(statmp2, swap_boxed_0(statmp1)) ;
                     ^
/usr/lib/ats2-postiats-0.2.0/ccomp/runtime/pats_ccomp_instrset.h:260:37: note: in definition of macro ‘ATSINSmove’
 #define ATSINSmove(tmp, val) (tmp = val)
                                     ^
temp_dats.c:293:1: note: expected ‘postiats_tyrec_1’ but argument is of type ‘postiats_tyrec_0’
 swap_boxed_0(postiats_tyrec_1 arg0)
 ^
master-q commented 9 years ago

レポートありがとうございます。

グローバル変数だからなのかとも思ったのですが、違いますね。。。 本家に問い合わせてみます。

#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"

fun swap_boxed{a,b:type} (xy: (a, b)): (b, a) = (xy.1, xy.0)

implement main0 () = {
  val AB = ( "A", "B" )
  val BA1 = swap_boxed{string,string} (AB)
}
master-q commented 9 years ago

String is not boxed type? · Issue #143 · githwxi/ATS-Postiats https://github.com/githwxi/ATS-Postiats/issues/143

問い合わせ中です。。。

master-q commented 9 years ago

以下のようなコードを使ってください、ということになりました。 stringはボックス化されたデータ型なのですが、デフォルトではボックス化されて扱われないそうです。

#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"

fun swap_boxed{a,b:type} (xy: (a, b)): (b, a) = (xy.1, xy.0)

implement
main0 () = {
  val A = box("A")
  val B = box("B")
  val BA = swap_boxed((A, B))
  val () = print_string (unbox(BA.0))
  val () = print_string (unbox(BA.1))
}

この対応に関する議論は以下を参照してください。

master-q commented 9 years ago

ATSプログラミング入門の該当章を修正すること。 > @master-q

https://github.com/githwxi/ATS-Postiats/commits/master/doc/BOOK/INT2PROGINATS/CHAP_POLYMORPH/main.atxt

master-q commented 9 years ago

修正しました。 http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/x1170.html

murasesyuka commented 9 years ago

確認しました。参照します