crossframe » Boo http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 Azure Storage Explorer & SharpDevelop ../../../20131005471/ ../../../20131005471/#comments Sat, 05 Oct 2013 13:05:14 +0000 http://xfra.me/?p=471 前々回のAzure Table Storage、前回のメタプログラミングの投稿で、補足しておきたいことがありましたので、ここにまとめて書きたいと思います。
Azure Table Storageは、LINQPad以外にも、Azure Storage Explorerという便利なツールがあったのでこれでもテストしてみました。

ver 4.0.0.10 (05.07.2011)

http://azurestorageexplorer.codeplex.com

AzureStorageExplorer1

ShapDevelopは、Boo言語が標準で対応しているのですね。以下のようにC#からコードがコンバートすることもできます。

ver 4.3.3 Build 9663 (.NET 4.0.30319.296)

http://sharpdevelop.codeplex.com/

sharpDevelop1
sharpDevelop2
sharpDevelop3
逆はできないようです。
ツールのメモでした。。

]]>
../../../20131005471/feed/ 0
メタプログラミング.NET ../../../20130929450/ ../../../20130929450/#comments Sun, 29 Sep 2013 12:50:36 +0000 http://xfra.me/?p=450 Windowsストアアプリの開発をしていたところ、Windows8.1環境が複数いることになり、ちょっと心が折れてしまいました。来月正式版がでるようなので、それを待って再開したいと思います。

それもあり、ASCIIから出たタイトルと同名の本に興味深い内容があったのでテストしてみました。
メタプログラムという、プログラムをプログラムする機能を使って、一つのコードから複数の.NET言語コードを生成してみました。
C++/CLI, C#, VB.NETの出力ができることを確認しましたが、それだけではつまらないと思い、VJ#とかやってみようと思いましたが、どうやら最近のVisualStdudioでは対応していないようです。F#も対応していないようです。
そして、本を読み進めていくとBooという言語があることを知りました。Mono(.NET互換環境)とかでよく使われているPythonに似た言語ということで、面白そうなのでこれを出力する方法調べてみました。

https://github.com/bamboo/boo にある、bin/Boo.Lang.CodeDom.dll をダウンロードして参照に追加します。
環境 : VisualStudio 2010 / Windows 7

using System;
using System.IO;
using System.Text;
using System.CodeDom;
using System.Diagnostics;
using System.CodeDom.Compiler;

class TestCodeDOM
{
    static void Main()
    {
        CodeNamespace prgNamespace = BuildProgram();
        var compilerOptions = new CodeGeneratorOptions()
        {
            IndentString = "  ",
            BracingStyle = "C",
            BlankLinesBetweenMembers = false
        };
        var codeText = new StringBuilder();
        using (var codeWriter = new StringWriter(codeText))
        {
            CodeDomProvider provider = new Boo.Lang.CodeDom.BooCodeProvider();

            ICodeGenerator gen = provider.CreateGenerator();
            CodeGeneratorOptions options = new CodeGeneratorOptions();
            gen.GenerateCodeFromNamespace(prgNamespace, codeWriter, compilerOptions);
        }
        Console.WriteLine(codeText.ToString());
        Console.ReadLine();
    }
    static CodeNamespace BuildProgram()
    {
        var ns = new CodeNamespace("TestCode");
        var systemImport = new CodeNamespaceImport("System");
        ns.Imports.Add(systemImport);
        var programClass = new CodeTypeDeclaration("Program");
        ns.Types.Add(programClass);
        var methodMain = new CodeMemberMethod
        {
            Attributes = MemberAttributes.Static,
            Name = "Main"
        };
        methodMain.Statements.Add(
          new CodeMethodInvokeExpression(
            new CodeSnippetExpression("Console"),
            "WriteLine",
            new CodePrimitiveExpression("Hello world")
          )
        );
        programClass.Members.Add(methodMain);
        return ns;
    }
}

これを実行すると以下のようなコードを出力します。

namespace TestCode
import System

class Program:
static def Main():
Console.WriteLine(“Hello world”)

言語プロバイダの部分を変更すると、VBやC#、C++も出力することができます。

CodeDomProvider provider = CodeDomProvider.CreateProvider("cpp");

.NETはいろんなことできるものですね。
ちょっと禁断の領域に足を踏み入れたかも・・

]]>
../../../20130929450/feed/ 0