タグ

ブックマーク / qiita.com/tenntenn (17)

  • もっと楽して式の評価器を作る #golang - Qiita

    はじめに Go Advent Calendar 2016にて、「簡単な式の評価機を作ってみる」という記事を書きました。 そこでは、抽象構文木(AST)を解析し、go/constantパッケージの機能を使って式の評価器を作るという話を書きました。 この記事では、go/typesパッケージの機能を使うことで、もっと楽して式の評価を行うプログラムを作ってみたいと思います。 なお、この記事を書いた時点におけるGoの最新バージョンは1.7.4です。 定数の評価 「Goのスコープについて考えてみよう」という記事でも触れましたが、go/typesパッケージには、以下のような機能が提供されています。 識別子の解決(identifier resolution) 型推論(type deduction) 定数の評価(constant evaluation) 「go/types: The Go Type Chec

    もっと楽して式の評価器を作る #golang - Qiita
    vvakame
    vvakame 2019/08/06
    式を静的に評価したい〜〜っていったらコレ読めって言われた
  • astutil.Applyで抽象構文木を置き換える #golang - Qiita

    はじめに Goには、標準パッケージ以外にも準標準にあたるgolang.org/x/以下で管理されているパッケージが存在します。ここで管理されているパッケージは、Go体と同様にGoチームによって管理され、コントリビュートの方法も概ね同じです。 この準標準パッケージには、さまざまなパッケージが存在します。これらは標準パッケージになるほど汎用的だったり、完成度は高くないはないですが、それでも十分に有用です。golang.org/x/tools/go/ast/astutilパッケージ(以降、astutilパッケージと表記)もそのひとつです。 astutilパッケージは静的解析で使用すると便利なパッケージで、抽象構文木(Abstract Syntax Tree, AST)に関連する便利な機能を提供します。静的解析や抽象構文木については、"goパッケージで簡単に静的解析して世界を広げよう"という記事

    astutil.Applyで抽象構文木を置き換える #golang - Qiita
    vvakame
    vvakame 2017/12/03
    これすき
  • goパッケージで簡単に静的解析して世界を広げよう #golang - Qiita

    はじめに Goの標準パッケージには、goパッケージというものがあり、Goのソースコードを静的解析するのに便利な機能が提供されています。 goパッケージを使うと、以下のようなツールが簡単に作れます。 ソースコードを自動生成するツール ソースコードに対してlintやフォーマットを行うツール リファクタリングツール ソースコードから特定の何かを検索するツール ミニ言語の処理系 また、goパッケージを学ぶとコンパイラや言語処理系の知識も学べるので、他の標準パッケージとはまた少し違った知識を得ることができ、プログラミングの知識の幅が広がります。 しかしながら、goパッケージに関する日語の文献は少なく、学習しづらいのが辛いところです。 私もこれまでgoパッケージについて、Qiita上でいくつか記事を書いてきましたが、どの記事が何をするときに役に立つのか分かりづらくなっていました。 そこでこの記事では

    goパッケージで簡単に静的解析して世界を広げよう #golang - Qiita
    vvakame
    vvakame 2017/11/17
  • go/typesパッケージを使い変数名をリネームしてみる #golang - Qiita

    はじめに Goには、gorenameという識別子をリネームするリファクタリングツールがあります。 以下のようにgo getすることで使用することができます。 また、「gorenameをライブラリとして使う」とう記事にも書いたとおり、gorenameはライブラリとしても利用することができます。 この記事では、gorenameほどは高機能では無いものの、ローカル変数のリネームをgo/typesパッケージの提供する機能で実装してみます。 なお、この記事を書いた時点のGoの最新バージョンは1.7.4です。 指定した位置にある識別子を取得する gorenameもそうですが、多くのリファクタリングツールでは、「何」を対象にリファクタリングを行うか、以下の2種類の方法で指定することが多いでしょう。 ずばり対象とするものを指定(この場合だと対象となる識別子) 対象となるもののソースコード上の位置 ソースコ

    go/typesパッケージを使い変数名をリネームしてみる #golang - Qiita
    vvakame
    vvakame 2017/11/17
    またtenntennさんや…!
  • Goの抽象構文木(AST)を手入力してHello, Worldを作る #golang - Qiita

    はじめに タイトルを見て、「はて?何を言ってるんだろう」と思った方もいるでしょう。 その通りです。通常、抽象構文木(AST)を取得するには、「ASTを取得する方法を調べる」で解説したように、go/parserパッケージの関数を使ってソースコードをパースする必要があります。 しかし、この記事では温かみのある手入力をすることで、日頃なんとなく取得しているASTがどういうノードで構築されているのか、最低限必要なフィールドは何なのかということを改めて知ることを目的としています。 なお、この記事を書いた時のGoの最新バージョンは1.7.4です。 今回作るコード 今回はかのプログラム言語Cやプログラミング言語Goで有名なHello, Worldを出力するプログラムを作りたいと思います。 具体的には、以下のようなコードです。 なお、せっかくなので、ここではGoっぽく、Hello, 世界としています。 p

    Goの抽象構文木(AST)を手入力してHello, Worldを作る #golang - Qiita
    vvakame
    vvakame 2017/11/10
    “format.Node” が知りたかった関数だった…ありがとうtenntennパパ…
  • go-app-builderのソースコードを読む #golang #gae - Qiita

    はじめに みなさんはGAE/GoのSDKがどうやってコードをビルドしているのか知っていますか? 私は正直ふわっとしか理解できておらず、きっと小人さんがビルドしてるんだろうなくらいに思ってました。 当然、小人さんじゃなくて、どこかにgoapp buildとかを呼んでいるコードがあるんだろうとは思っていましたが、どうやらgo-app-builderというツールがそれをやっていることを知ったので、調べてみることにしました。 今回は、ソースコードを読んでいく過程で分かったことをまとめたいと思います。 なお、ここではSDKのバージョンはappengine-1.9.48を使っています。 ソースコードはどこにあるのか さて、go-app-builderはどこにあるんでしょうか。きっとSDKのディレクトリのどこかです。 実はSDK以下にあるgorootの中に入っています。 $ ls $(goapp env

    go-app-builderのソースコードを読む #golang #gae - Qiita
    vvakame
    vvakame 2016/12/14
  • [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae - Qiita

    はじめに go test(GAE/Goの場合はgoapp test)で、自身のプロジェクトのテストを走らせる際、非常に時間がかかってしまいテストの実行が億劫になることがあります。 特にGAEだとaetestパッケージを使わなくてもそれなりに時間がかかります。 GAE/Goのテストを早くするには、favclip/testeratorを使ってインスタンスを使いまわすという方法もあります。 しかしながら、それでもそれなりに時間がかかるので、どうにか更新のあったソースコードに関わるテストだけ実行できないかと考えました。 なお、この記事ではgitなどを使ってバージョン管理している前提で書いています。 また、おそらくちゃんと動くだろうとは思いますが、まだ検証中なのでデプロイする前には、ちゃんとすべてのテストを実行することをオススメします。 coverprofileを使う go testのオプションには

    [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae - Qiita
    vvakame
    vvakame 2016/10/19
    モノリシックなパッケージという原罪を抱えている我々は…
  • Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE - Qiita

    はじめに Google App Engine for Go (GAE/Go) を使っていて、ローカルでデバッグがしたくなることがあるかと思います。 Goにはいくつかデバッガがあり、IDEが対応しているものもあります。 ここでは Delve というデバッガを使ってデバッグする方法を紹介します。 Delveは動いているGoのプロセスにアタッチしてデバッグすることができます。 そのため、GAE/Goのローカルサーバのプロセスにもアタッチしてデバッグすることができます。 しかし、GAE/Goのローカルサーバのプロセスは、複数動いていたり、切り替わったりするため、一筋縄ではいきません。 ここでは、以下の記事を基に、ターミナル上でローカルサーバのデバッグをやってみます。 Debugging Golang Appengine module with Visual Studio Code Delveのイン

    Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE - Qiita
    vvakame
    vvakame 2016/08/23
    つよい…!!(できたの知らなかった
  • [Go言語] 埋め込んだときに、メソッド名が被っててインタフェースを実装できない場合はどうするのか? - Qiita

    明示的に判別ないとインタフェースの型として振る舞えない 以下のように、同じNameというメソッドを持つ構造体を埋め込むと、NamedというNameを持つインタフェースを実装できない。 なぜならば、HogeのNameを呼べばいいのか、PiyoのNameを呼べばいいのか分からない。 もちろん、Foo型として振る舞っているときは明示的に埋め込んでいる型を指定すれば、呼び出せる。 package main import "fmt" type Named interface { Name() string } type Hoge struct { } func (_ *Hoge) Name() string { return "Hoge" } func (_ *Hoge) HogeMethod() { fmt.Println("Hoge Method!") } type Piyo struct {

    [Go言語] 埋め込んだときに、メソッド名が被っててインタフェースを実装できない場合はどうするのか? - Qiita
    vvakame
    vvakame 2015/01/14
  • [Go言語]structにinterfaceを埋め込んで,動的に入れ替えるパターン - Qiita

    正直,何に使えるのよくわかりませんが,以下のようにすると動的にinterfaceの実装方法を変更できることに気づきました. structの匿名フィールド(埋め込み)として,interfaceを設定すると,そのstructも埋め込んだinterfaceを実装していることになります.埋め込んだinterfaceは匿名フィールドなので,型名でアクセスして入れ替えることができます. 以下の例では,fmt.Stringerインタフェースの実装を動的に変更しています. Go Playgroundで実行する package main import ( "fmt" "strings" ) type StringerFunc func() string func (sf StringerFunc) String() string { return sf() } type Person struct { fm

    [Go言語]structにinterfaceを埋め込んで,動的に入れ替えるパターン - Qiita
    vvakame
    vvakame 2015/01/14
  • インタフェースの実装パターン #golang - Qiita

    はじめに この記事は,以下の過去にQiitaに投稿したインタフェースの実装パターンの記事に,typeやメソッド,インタフェースの基的な説明を追加してわかりやすくしたものです. Go言語における埋め込みによるインタフェースの部分実装パターン structにinterfaceを埋め込んで,動的に入れ替えるパターン まずtypeとメソッド,基的なインタフェースの実装方法についておさらいすることで,さまざまなインタフェースの実装パターンを扱う準備をしましょう. typeで型を宣言する まずはじめに,Go言語における型の宣言方法をおさらいします.Go言語をはじめたばかりの方の中に,typeの使い方を限定的にしか理解していない方をよく見かけます.ご存知のとおり,typeは型を宣言するために使うキーワードです.以下のように,構造体型やインタフェース型の宣言の際に,使用することが多いでしょう. //

    インタフェースの実装パターン #golang - Qiita
    vvakame
    vvakame 2015/01/14
  • Go言語における埋め込みによるインタフェースの部分実装パターン - Qiita

    構造体 Go言語には、クラスがない。そのため、代わりに構造体(struct)を使い、その型にメソッドを設けることで似たような振る舞いをさせる。 package main import "fmt" type Person struct { FirstName string LastName string } func (p *Person) Name() string { return p.FirstName + " " + p.LastName } func main() { person := &Person{"Taro", "Yamada"} fmt.Println(person.Name()) }

    Go言語における埋め込みによるインタフェースの部分実装パターン - Qiita
    vvakame
    vvakame 2015/01/14
  • 埋め込みを他のパッケージから隠蔽する #golang - Qiita

    以下の記事にも書いているが,構造体型へ別の型を匿名フィールドとして埋め込む場合,型がパッケージ外に公開してあると,パッケージ外からその匿名フィールドにアクセスできてしまう. インタフェースの実装パターン たとえば,以下のようにHoge型に*Fuga型を埋め込んだ場合,Fuga型はパッケージ外に公開されているため,埋め込んだFuga型の値にもアクセスできてしまう.

    埋め込みを他のパッケージから隠蔽する #golang - Qiita
    vvakame
    vvakame 2014/12/19
  • RequireJSで循環参照 - Qiita

    ここを参考に、循環参照を解決する方法を記述する。 A.jsとB.jsがそれぞれのモジュールを相互に使いたい場合、以下のように、requireを使って、必要な時にモジュールを取得すれば良い。 そうしなければ、どちらかのモジュールは undefined になる。 define('A',['require', 'B'], function(require, B) { function A() { var B = require("B"); this.name = "A"; this.b = new B(); } return A; }); define('B',['require', 'A'], function(require, A) { function B() { var A = require("A"); this.name = "B"; this.a = new A(); } retu

    RequireJSで循環参照 - Qiita
  • Go言語でWebAppの開発に必要なN個のこと - Qiita

    元ネタ あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずGo言語について知っていることを書いた。 パッケージマネージャ 標準でついてるgoツールを使おう。必要なライブラリはリポジトリから、go getで取ってこよう。 http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies アプリケーションサーバ 標準パッケージのnet/httpパッケージを使えばhttpサーバを動かすことができる。apacheやnginxで動かしたかったら、標準パッケージのnet/http/cgiパッケージやnet/http/fcgiパッケージを使えばいい。 http://golang.or

    Go言語でWebAppの開発に必要なN個のこと - Qiita
    vvakame
    vvakame 2013/09/11
  • Goの初心者が見ると幸せになれる場所 #golang - Qiita

    公式サイト A Tour of Go Web上で実行しながら学ぶことができる公式のチュートリアルです。 チュートリアル 公式のチュートリアルです。初学者向けからジェネリクスのチュートリアルなども用意されています。 A Tour of Goが終わった後に取り組むと良いでしょう。 Go Wiki Go Code Review Commentsなどが掲載されているGitHub上のWikiです。 パッケージドキュメント 標準パッケージやサードパーティ製のパッケージのドキュメントが見れるサイトです。検索もできます。 入門 プログラミング言語Go完全入門 筆者が作っている巨大なGoの入門資料です。なぜGoが作られたのか、から最新のジェネリクスの情報、静的解析まで扱っています。 Gopher道場 Goを体系的に学べる場です。10時間くらいある動画教材(自習室から入手可)もあります。 Go の最初の手順

    Goの初心者が見ると幸せになれる場所 #golang - Qiita
    vvakame
    vvakame 2013/06/05
  • AngularJS + Typescript用のyeomanのgenerator - Qiita

    JakubMrozek/generator-angular-typescriptというgeneratorがある。 基的にreadme.mdに書いてある通りにすれば動く。 「grunt server」を実行した際に、「components/types/angularjs/angular.d.ts:88」でエラーが出る場合は、 directive(name: string, directiveFactory: (...params)=> IDirective): IModule;

    AngularJS + Typescript用のyeomanのgenerator - Qiita
  • 1