SlideShare a Scribd company logo
1 of 56
Download to read offline
genuine-highlighter:! 
!マクロを認識するClojure向けの! 
シンタックスハイライター 
Shibuya.lisp TT #8! 
14/08/30 @athos0220
自己紹介 
• 名古屋圏内在住 
• 組込み業界で働くプログラマ 
• 絶賛転職活動中 
@athos0220
シンタックスハイライト
シンタックスハイライト 
Javaのシンタックスハイライト結果 on Emacs
シンタックスハイライト 
• コード中の重要な部分を強調し、重要でない部分を目 
立たなくすることでコードを読む効率を上げる 
• 予約語などを強調 
• コメントなどを薄めに 
• 予約語のハイライトでつづり間違いに気づく作用も 
• 多くのエディタやコードビューワで使われているごくあ 
りふれた機能
でも精度よくないことが多い 
ハイライトの仕方に一貫性がない
精度よくないといけないのか? 
• 重要なものを強調し、重要でないものを目立た 
なくすることでコードを読む効率を上げる 
• 人は誤ったハイライトを繰り返し目にすること 
でハイライトを無視するようになる[要出典]
そんなに簡単な仕事ではない 
シンタックスハイライターで起こりがちなミス 
“catch me if you can” 
; 文字列中のキーワードをハイライトしてしまう 
(quote (if)) 
; クオートの中のキーワードをハイライトしてしまう 
(let [name #(subs (name %) 1)] 
(name ’foo)) 
; トップレベル変数とローカル変数のハイライトが一貫 
; していない
Lisp系言語に固有の難しさ 
• 予約語がない 
• 構文キーワードをローカル変数でシャドウイ 
ングできる 
• ユーザがマクロを使って独自構文を定義できる 
• シンボルがどう使われるかはマクロを展開して 
みないと分からない
genuine-highlighter
genuine-highlighterの狙い 
• シンボルの使われ方を(可能な限り)忠実にハイラ 
イトし分けられるハイライターを実現する 
• Var 
• ローカル変数 
• 特殊形式 
• マクロ 
• 特定の出力形式(eg. HTML)に依存しないポータ 
ブルな実装
genuine-highlighterの特徴 
• マクロを認識するClojure向けのシンタックスハ 
イライター 
• ユーザが新しい出力形式へ対応させられるよう 
に拡張できる
genuine-highlighterの特徴 
• マクロを認識するClojure向けのシンタックスハ 
イライター! 
• ユーザが新しい出力形式へ対応させられるよう 
に拡張できる
source code 
parse 
analyze 
render 
object format
source code 
parse 
analyze 
render 
object format
• Clojureリーダで読み込むとそのまま 
書き戻せない 
• コメントが削除される 
• インデントが崩れる 
• リーダマクロが展開される 
• 読み込んだ後にそのまま書き戻せる 
中間形式へパース(Sjacket) 
source code 
parse 
analyze 
render 
object format
{:tag :net.cgrand.sjacket.parser/root, 
:content 
[{:tag :quote, 
:content 
["'" 
{:tag :list, 
:content 
["(" 
{:tag :symbol, :content [{:tag :name, :content ["foo"]}]} 
{:tag :whitespace, :content [" "]} 
{:tag :symbol, :content [{:tag :name, :content ["bar"]}]} 
")"]}]}]} 
’(foo bar) 
quote 
foo 
bar 
Sjacket形式 
テキスト 
S式
• Clojureリーダで読み込むとそのまま 
書き戻せない 
• コメントが削除される 
• インデントが崩れる 
• リーダマクロが展開される 
• 読み込んだ後にそのまま書き戻せる 
中間形式へパース(Sjacket) 
source code 
parse 
analyze 
render 
object format
• 解析器(symbol-analyzer) 
• ハイライターのコア部分 
• コード中のシンボルの使われ方 
を解析する独立したライブラリ 
• 詳細は後述 
source code 
parse 
analyze 
render 
object format
• 解析器の解析結果を付加した中間 
形式を書き出す 
• ハイライトのルールをマップで定義 
できる 
source code 
parse 
analyze 
render 
object format
; ハイライトのルールはマップで定義される 
(def rainbow-parens-rule 
(let [colors (atom (cycle (range 31 38))) 
color-stack (atom nil) 
open-fn (fn [x v] 
(let [[color] @colors] 
(swap! colors rest) 
(swap! color-stack conj color) 
(color-ansi color v))) 
close-fn (fn [x v] 
(let [[color] @color-stack] 
(swap! color-stack rest) 
(color-ansi color v)))] 
{:list {:open open-fn, :close close-fn} 
:vector {:open open-fn, :close close-fn} 
:map {:open open-fn, :close close-fn}})) 
! 
; ルール同士の合成も簡単にできる 
(compound-rules r1 r2)
• 解析器の解析結果を付加した中間 
形式を書き出す 
• ハイライトのルールをマップで定義 
できる 
source code 
parse 
analyze 
render 
object format
symbol-analyzer
symbol-analyzer 
• コード中のシンボルの使われ方を解析する 
• マクロを展開しつつ、構文木をトラバースする 
code walkerとして構築
問題 
マクロ展開前
問題 
マクロ展開前 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)])
問題 
マクロ展開前 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
(let* [reader (reader “foobar.txt”)] 
(try 
マクロ展開後 
[(read reader) (read reader)] 
(finally 
(.close reader))))
問題 
マクロ展開前 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
(let* [reader (reader “foobar.txt”)] 
(try 
マクロ展開後 
[(read reader) (read reader)] 
(finally 
(.close reader))))
問題 
マクロ展開前 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
(let* [reader (reader “foobar.txt”)] 
(try 
マクロ展開後 
[(read reader) (read reader)] 
(finally 
(.close reader))))
問題 
マクロ展開前 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
(let* [reader (reader “foobar.txt”)] 
(try 
マクロ展開後 
[(read reader) (read reader)] 
(finally 
(.close reader))))
問題 
マクロ展開前 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
(let* [reader (reader “foobar.txt”)] 
(try 
マクロ展開後 
[(read reader) (read reader)] 
(finally 
(.close reader)))) 
どのシンボルが展開前のどれに対応するのか! 
マクロ展開後の形だけ見ても分からない
テレメトリーメタファー 
Telemetry is the highly automated communications 
process by which measurements are made and other data 
collected at remote or inaccessible points and transmitted 
to receiving equipment for monitoring. (snip) Telemetry is 
used to study wildlife, and has been useful for monitoring 
threatened species at the individual level. Animals under 
study can be outfitted with instrumentation tags, which 
include sensors that measure temperature, diving depth 
and duration (for marine animals), speed and location 
(using GPS or Argos packages). “Telemetry” from Wikipedia
テレメトリーメタファー 
Telemetry is the highly automated communications 
process by which measurements are made and other data 
collected at remote or inaccessible points and transmitted 
to receiving equipment for monitoring. (snip) Telemetry is 
used to study wildlife, and has been useful for monitoring 
threatened species at the individual level. Animals under 
study can be outfitted with instrumentation tags, which 
include sensors that measure temperature, diving depth 
and duration (for marine animals), speed and location 
(using GPS or Argos packages). “Telemetry” from Wikipedia 
野生動物にタグづけして自然に放し、生態を調査する
テレメトリーメタファー 
Telemetry is the highly automated communications 
process by which measurements are made and other data 
collected at remote or inaccessible points and transmitted 
to receiving equipment for monitoring. (snip) Telemetry is 
used to study wildlife, and has been useful for monitoring 
threatened species at the individual level. Animals under 
study can be outfitted with instrumentation tags, which 
include sensors that measure temperature, diving depth 
and duration (for marine animals), speed and location 
(using GPS or Argos packages). “Telemetry” from Wikipedia 
野生動物にタグづけして自然に放し、生態を調査する 
同様に、シンボルに目印をつけて! 
マクロ展開後の生態(使われ方)を調査する
どう実現するか?
メタデータ 
• データにつけられる付加的な情報 
• データに対する操作へは影響を与えない 
• Clojureで使われる多くのデータ型につけられる 
• シンボル、リスト、マップ、関数、etc.
メタデータ 
user=> ; シンボルfooに{:bar true}というメタデータをつける 
user=> (def x (with-meta ’foo {:bar true})) 
#’user/x 
user=> x 
foo 
user=> ; meta関数でメタデータを取得 
user=> (meta x) 
{:bar true} 
user=> ; メタデータがついていても通常のシンボルと同じように使える 
user=> (symbol? x) 
true 
user=> ; リーダマクロ^を使うとリード時にメタデータをつけられる 
user=> (def y ’^{:bar true}foo) 
#’user/y 
user=> (meta y) 
{:bar true}
解析ステップ1:マーキング 
ユニークなメタデータでシンボルをマーキング 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
! 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)])
解析ステップ2:抽出 
マクロ展開して特殊形式毎にパターンマッチで解析 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
! 
マクロ展開 
(let* [reader (reader “foobar.txt”)] 
(try 
[(read reader) (read reader)] 
(finally 
(.close reader)))) 
マクロ 
トップレベル変数 
抽出 
ローカル変数トップレベル変数 
ローカル変数トップレベル変数ローカル変数
解析ステップ3:アノテーション 
解析結果をメタデータとして元のシンボルにつける 
マクロ 
(with-open [reader (reader “foobar.txt”)] 
[(read reader) (read reader)]) 
トップレベル変数 
ローカル変数トップレベル変数 
トップレベル変数ローカル変数 
ローカル変数
source code 
parse 
analyze 
render 
object format 
Sjacket 
Sjacket 
S式 
シンボル! 
情報 
マーキング! 
・変換 
抽出 
アノテーション
基本的なAPI:extract 
メタデータでマーキングしたシンボルの使われ方を返す 
user=> (extract '(let [^{:id 0} x 42] x)) 
{0 {:type :local, :usage :def}} 
user=> (def x 42) 
#'user/x 
user=> (extract 
'(let [^{:id 0} x ^{:id 1} x] 
[^{:id 2} x '^{:id 3} x])) 
; (let [x x] 
; [x ’x]) 
{0 {:type :local, :usage :def}, 
1 {:type :var, :usage :ref, :var #'user/x}, 
2 {:type :local, :usage :ref, :binding 0}, 
3 {:type :quote},} 
user=> 
! 
!
基本的なAPI:analyze 
すべてのシンボルを対象にextractを呼び出す
基本的なAPI:analyze 
すべてのシンボルを対象にextractを呼び出す 
user=> (analyze-sexp '(let [x x] [x 'x]))
基本的なAPI:analyze 
すべてのシンボルを対象にextractを呼び出す 
user=> (analyze-sexp '(let [x x] [x 'x])) 
(let [x x] [x (quote x)]) 
user=>
基本的なAPI:analyze 
すべてのシンボルを対象にextractを呼び出す 
user=> (analyze-sexp '(let [x x] [x 'x])) 
(let [x x] [x (quote x)]) 
user=> 
user=> (set! *print-meta* true) 
nil 
user=>
基本的なAPI:analyze
基本的なAPI:analyze 
user=> (analyze-sexp '(let [x x] [x 'x]))
基本的なAPI:analyze 
user=> (analyze-sexp '(let [x x] [x 'x])) 
(^{:symbol-info {:type :macro, :macro #’clojure.core/let} 
:id 10} let 
[^{:symbol-info {:type :local, :usage :def}, :id 11} x 
^{:symbol-info {:type :var, 
:usage :ref, 
:var #’user/x}, 
:id 12} x] 
[^{:symbol-info {:type :local, 
:usage :ref, 
:binding 11}, 
:id 13} x 
(^{:symbol-info {:op ^{:id 14} quote, :type :special}, 
:id 14} quote 
^{:symbol-info {:type :quote}, :id 15} x)]) 
user=>
symbol-analyzerの応用 
• シンタックスハイライトだけに限らず使えるケース考え 
られる 
• マクロ展開しきったコンパイラに渡る直前の形ではなく、 
「ユーザがコードをどう書いたか」を知りたい場合も 
ある 
• コーディング規約チェッカー 
• コードのメトリクス計測 
• マクロ定義への応用
マクロ定義への応用 
×安易なマクロ定義例 
(defmacro defmacro/g! [name args & body] 
(let [syms (->> (flatten body) 
(filter g!-symbol?) 
distinct)] 
`(defmacro ~name ~args 
(let ~(-> (fn [s] 
`[~s (gensym ~(subs (name s) 2))]) 
(mapcat syms) 
vec) 
~@body))))) 
“Let Over Lambda”より defmacro/g!をClojureへ移植 
リテラルとしてのシンボル等も誤って含まれてしまう 
しかし、厳密にやるとコードウォーカーが必要で面倒
マクロ定義への応用 
◎symbol-analyzerを使ったより正確な定義例 
(defmacro defmacro/g! [name args & body] 
(let [syms (->> (flatten (analyze-sexp body)) 
(filter #(and (g!-symbol? %) 
(= (-> (meta %) 
:symbol-info 
:type) 
:none))) 
distinct)] 
`(defmacro ~name ~args 
(let ~(-> (fn [s] 
`[~s (gensym ~(subs (name s) 2))]) 
(mapcat syms) 
vec) 
~@body)))))
source code 
parse 
analyze 
render 
object format 
Sjacket 
Sjacket 
S式 
シンボル! 
情報 
マーキング! 
・変換 
抽出 
アノテーション
デモ
まとめ 
• マクロを認識するシンタックスハイライターと、 
そのコアで使われる解析器を紹介 
• 解析器はシンタックスハイライトだけでなく、 
コードウォークが必要なマクロ定義等に応用可 
• 今後の課題は、コーナーケースへの対応とそれ 
に向けたClojureコンパイラの利用可否の検討
• genuine-highlighter 
• https://github.com/athos/genuine-highlighter 
• symbol-analyzer 
• https://github.com/athos/symbol-analyzer

More Related Content

What's hot

Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jlShintaro Fukushima
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JPSercan Ahi
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Shintaro Fukushima
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用Shintaro Fukushima
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門Shintaro Fukushima
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020Fujio Kojima
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要Toshihiro Kamishima
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swiftnecocen
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsFumitaka Yamada
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-Shintaro Fukushima
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
ゆるふわJava8入門
ゆるふわJava8入門ゆるふわJava8入門
ゆるふわJava8入門dcubeio
 
Processing.jsでおうちハック
Processing.jsでおうちハックProcessing.jsでおうちハック
Processing.jsでおうちハックsonycsl
 

What's hot (20)

Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JP
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
ゆるふわJava8入門
ゆるふわJava8入門ゆるふわJava8入門
ゆるふわJava8入門
 
Processing.jsでおうちハック
Processing.jsでおうちハックProcessing.jsでおうちハック
Processing.jsでおうちハック
 

Viewers also liked

Using virtual learning spaces to enhance learning and teaching #SHUspice
Using virtual learning spaces to enhance learning and teaching #SHUspiceUsing virtual learning spaces to enhance learning and teaching #SHUspice
Using virtual learning spaces to enhance learning and teaching #SHUspiceSue Beckingham
 
Leveraging Social Media For Increased Student Engagement
Leveraging Social Media For Increased Student EngagementLeveraging Social Media For Increased Student Engagement
Leveraging Social Media For Increased Student EngagementRed Rover
 
Releasing the Power of Your Network - 17-12-2015 - Phill Butler
Releasing the Power of Your Network - 17-12-2015 - Phill ButlerReleasing the Power of Your Network - 17-12-2015 - Phill Butler
Releasing the Power of Your Network - 17-12-2015 - Phill ButlervisionSynergy
 
ראש אחר מאמרה של לילך וסרמן
ראש אחר מאמרה של לילך וסרמןראש אחר מאמרה של לילך וסרמן
ראש אחר מאמרה של לילך וסרמןhila_el
 
Social Media Strategies for Planning
Social Media Strategies for PlanningSocial Media Strategies for Planning
Social Media Strategies for PlanningJennifer Evans-Cowley
 
Foro parte 1 Pereira Nathaly- Economía Popular y Solidaria
Foro parte 1 Pereira Nathaly- Economía Popular y SolidariaForo parte 1 Pereira Nathaly- Economía Popular y Solidaria
Foro parte 1 Pereira Nathaly- Economía Popular y SolidariaNath Pereira
 
Hadoop Hackday at the SlideShare office
Hadoop Hackday at the SlideShare officeHadoop Hackday at the SlideShare office
Hadoop Hackday at the SlideShare officeAmit Ranjan
 
How to Build a Collaborative Approach to Reaching Your UUPG
How to Build a Collaborative Approach to Reaching Your UUPGHow to Build a Collaborative Approach to Reaching Your UUPG
How to Build a Collaborative Approach to Reaching Your UUPGvisionSynergy
 
Picture of the Day - Handouts
Picture of the Day - HandoutsPicture of the Day - Handouts
Picture of the Day - HandoutsJennifer Jones
 
James Caan Business Secrets App
James Caan Business Secrets AppJames Caan Business Secrets App
James Caan Business Secrets AppJamesCaan
 
The Great Pairs Series #1
The Great Pairs Series #1The Great Pairs Series #1
The Great Pairs Series #1Dr. Chris Stout
 
Event Report - Microsoft Connect - No April's Fools - Linux, Google and more
Event Report - Microsoft Connect - No April's Fools - Linux, Google and more Event Report - Microsoft Connect - No April's Fools - Linux, Google and more
Event Report - Microsoft Connect - No April's Fools - Linux, Google and more Holger Mueller
 
Hiring Hackers
Hiring HackersHiring Hackers
Hiring HackersLookout
 
Startup Mistakes
Startup MistakesStartup Mistakes
Startup MistakesCrowdinvest
 
Belas fotos de diversos países
Belas fotos de diversos países Belas fotos de diversos países
Belas fotos de diversos países Maria Godinho
 

Viewers also liked (20)

Matemáticas
MatemáticasMatemáticas
Matemáticas
 
Using virtual learning spaces to enhance learning and teaching #SHUspice
Using virtual learning spaces to enhance learning and teaching #SHUspiceUsing virtual learning spaces to enhance learning and teaching #SHUspice
Using virtual learning spaces to enhance learning and teaching #SHUspice
 
Leveraging Social Media For Increased Student Engagement
Leveraging Social Media For Increased Student EngagementLeveraging Social Media For Increased Student Engagement
Leveraging Social Media For Increased Student Engagement
 
Releasing the Power of Your Network - 17-12-2015 - Phill Butler
Releasing the Power of Your Network - 17-12-2015 - Phill ButlerReleasing the Power of Your Network - 17-12-2015 - Phill Butler
Releasing the Power of Your Network - 17-12-2015 - Phill Butler
 
March Pictures
March PicturesMarch Pictures
March Pictures
 
ראש אחר מאמרה של לילך וסרמן
ראש אחר מאמרה של לילך וסרמןראש אחר מאמרה של לילך וסרמן
ראש אחר מאמרה של לילך וסרמן
 
Social Media Strategies for Planning
Social Media Strategies for PlanningSocial Media Strategies for Planning
Social Media Strategies for Planning
 
Foro parte 1 Pereira Nathaly- Economía Popular y Solidaria
Foro parte 1 Pereira Nathaly- Economía Popular y SolidariaForo parte 1 Pereira Nathaly- Economía Popular y Solidaria
Foro parte 1 Pereira Nathaly- Economía Popular y Solidaria
 
Hadoop Hackday at the SlideShare office
Hadoop Hackday at the SlideShare officeHadoop Hackday at the SlideShare office
Hadoop Hackday at the SlideShare office
 
How to Build a Collaborative Approach to Reaching Your UUPG
How to Build a Collaborative Approach to Reaching Your UUPGHow to Build a Collaborative Approach to Reaching Your UUPG
How to Build a Collaborative Approach to Reaching Your UUPG
 
Picture of the Day - Handouts
Picture of the Day - HandoutsPicture of the Day - Handouts
Picture of the Day - Handouts
 
James Caan Business Secrets App
James Caan Business Secrets AppJames Caan Business Secrets App
James Caan Business Secrets App
 
The Great Pairs Series #1
The Great Pairs Series #1The Great Pairs Series #1
The Great Pairs Series #1
 
Event Report - Microsoft Connect - No April's Fools - Linux, Google and more
Event Report - Microsoft Connect - No April's Fools - Linux, Google and more Event Report - Microsoft Connect - No April's Fools - Linux, Google and more
Event Report - Microsoft Connect - No April's Fools - Linux, Google and more
 
Tirrell
TirrellTirrell
Tirrell
 
Hiring Hackers
Hiring HackersHiring Hackers
Hiring Hackers
 
Startup Mistakes
Startup MistakesStartup Mistakes
Startup Mistakes
 
Lecture 10 os
Lecture 10 osLecture 10 os
Lecture 10 os
 
Belas fotos de diversos países
Belas fotos de diversos países Belas fotos de diversos países
Belas fotos de diversos países
 
Sistema educacional do Japão
Sistema educacional do JapãoSistema educacional do Japão
Sistema educacional do Japão
 

Similar to genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター

10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101Nobuaki Oshiro
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CITDaiki Maekawa
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワルAndrosia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワルCODE BLUE
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力imuyaoti
 
文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析Preferred Networks
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話k1complete
 
R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42Atsushi Hayakawa
 

Similar to genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター (20)

10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CIT
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワルAndrosia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
pi-6. 繰り返し
pi-6. 繰り返しpi-6. 繰り返し
pi-6. 繰り返し
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力
 
R intro
R introR intro
R intro
 
Vespa 機能紹介 #yjmu
Vespa 機能紹介 #yjmuVespa 機能紹介 #yjmu
Vespa 機能紹介 #yjmu
 
文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42
 

More from sohta

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものsohta
 
入門Transducers
入門Transducers入門Transducers
入門Transducerssohta
 
Clojure Language Update (2015)
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)sohta
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScriptsohta
 
入門core.async
入門core.async入門core.async
入門core.asyncsohta
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
REPLライフをもっと快適に
REPLライフをもっと快適にREPLライフをもっと快適に
REPLライフをもっと快適にsohta
 
ClojureではじめるSTM入門
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門sohta
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojuresohta
 
Clojureによるバイトコードプログラミング
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミングsohta
 

More from sohta (10)

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
 
入門Transducers
入門Transducers入門Transducers
入門Transducers
 
Clojure Language Update (2015)
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScript
 
入門core.async
入門core.async入門core.async
入門core.async
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
REPLライフをもっと快適に
REPLライフをもっと快適にREPLライフをもっと快適に
REPLライフをもっと快適に
 
ClojureではじめるSTM入門
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojure
 
Clojureによるバイトコードプログラミング
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター