差分

ナビゲーションに移動 検索に移動

真正末尾再帰

454 バイト除去, 2016年3月2日 (水) 05:13
編集の要約なし
== 実装1 ==Xamarin.Mac 2.0系の場合はCGImageDestination.Createのまま。Xamarin.Mac 1.0系の場合はCGImageDestination.FromUrlに変更する。<source lang="csharp">using System;using Foundation;using CoreGraphics;using ImageIO;'''真正末尾再帰'''とは、[[末尾再帰]]を利用することで確実に[[末尾再帰最適化]]が行われることが保証される[[プログラミング言語]]のことである。単に「真正」「真正的」などと呼ばれることもある。
namespace Library{ public static class CGImageExtensions { public static bool Save(this CGImage cgImage, string path, string typeIdentifier) { using (var url = NSUrl.FromFilename(path)) using (var dst = CGImageDestination.Create(url, typeIdentifier, imageCount:1)) { if (dst 概要 == null) { return false; }[[末尾再帰]]を利用することで確実に[[末尾再帰最適化]]が行われるため、末尾再帰をいくら使用しても[[コールスタック]]などの[[リソース]]を食いつぶすなどの挙動がなく、結果として[[再帰]]の呼び出し回数に制限がない状態をいう。
dst.AddImage(cgImage);また、このような[[末尾再帰最適化]]が必ず行われることが保証されている[[処理系]]([[プログラミング言語]])を指す。
return dst.Close(); } } }}</source> 引数typeIdentifierはMobileCoreServices.UTTypeに定義されている定数文字列群を指定する。拡張子で自動判別するようにしてMobileCoreServices.UTTypeを無視するようにした方が直感的かもしれない。<source lang="csharp"> cgImage.Save(save, MobileCoreServices.UTType.PNG);</source>[[正格評価]]の[[関数型プログラミング言語]]を名乗る[[言語]]であれば、ほぼ真正末尾再帰であると思ってよい。ただし[[正格評価]]の代表格である[[LISP]]だけは何故か真正末尾再帰ではない。その派生品である[[Scheme]]などでは真正になっている。
== 関連項目 ==
*[[MonoMac/NSImageをファイルに保存する再帰]]*[[Xamarin.Mac/NSViewの描画内容をファイルに保存する末尾再帰]]*[[Xamarin.Mac/CoreGraphicsの基本的な使い方]]*[[Xamarin.Mac/動画から静止画を抽出する]]*[[Xamarin.Mac/スクリーンキャプチャを撮る]]*[[Xamarin.Mac/CGImageをNSImageに変換する]]*[[Xamarin.Mac/NSOpenGLViewを使う]]*[[Xamarin.Mac/効果音を再生する末尾再帰最適化]]
== 参考文献 ==
{{stub}}
 
[[category: Xamarin.Mac]]
[[category: Core Graphics]]
匿名利用者

案内メニュー