SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
Clojureシンタックスハイライター
開発から考える
これからのLispに必要なもの
Lisp meet up #30
@athos0220
genuine-highlighter
‣ マクロを認識するシンタックス
ハイライター
‣ Clojureの細粒度解析器 
symbol-analyzer上に実現
‣ 技術的な詳細はShibuya.lisp TT
#8を参照
lein-highlight
genuine-highlighter
symbol-analyzer
シンタックスハイライターから感じたこと
‣ 解析の精度を上げようとすればするほど、リーダやコン
パイラがやっていることの再実装をするハメに
‣ リーダやコンパイラ等、標準機能は再利用できなかった
‣ Lispはメタプログラミングに強い言語だったのでは…?
LispはLispコードを扱うのが得意
LispはLispコードを扱うのが得意
LispはLispコードを扱うのが得意
LispはS式を扱うのが得意
Lispの強力さの秘訣
ソースコード
マクロ
展開済みS式
S式
read
macro
expand compile
Lispの強力さの秘訣
ソースコード
マクロ
展開済みS式
S式
read
macro
expand compile
コンパイラが感知するのは
これ以降
最終的にコンパイラの知るフォームに落ちれば
マクロやリーダマクロで自由に拡張可能
Lispの強力さの秘訣
‣ Lispは「プログラマが実際にどういうコードを書いているのか」に
無頓着になることで強力な拡張性を得てきた
‣ そのことがコードの静的解析を難しくしている
ソースコード
マクロ
展開済みS式
S式
read
macro
expand compile
コンパイラが感知するのは
これ以降
最終的にコンパイラの知るフォームに落ちれば
マクロやリーダマクロで自由に拡張可能
Clojure界隈での事情
‣ コード解析が不完全なツールたち
• Kibit: コーディングチェッカ
• bikeshed: コーディングチェッカ
• Yagni: コールグラフ解析ツール
• cloverage: カバレッジツール
• clojail: サンドボックスツール
• etc. etc.
‣ tools.analyzerの登場により、状況はある程度改善したが
tools.analyzerを使っても不十分なケースも少なくない
コードの“読み手”
プログラマ 処理系コード
コードの“読み手”
カバレッジツールコードフォーマッタ
IDE・エディタ メトリクス計測ツール
プログラマ 処理系
コーディングチェッカ
コード
コードの“読み手”
‣ プログラマと処理系だけがコードを読む牧歌的な時代は終わり、
今や多くのCASE ツールがコードを読む時代
‣ これらのツールの多くが知りたいのは「プログラマがどういう
コードを書いたか」≠ コンパイラにどんなコードが渡るか
*1
カバレッジツールコードフォーマッタ
IDE・エディタ メトリクス計測ツール
プログラマ 処理系
コーディングチェッカ
*1 CASE: Computer-Aided Software Engineering,
    一般にはもっと高機能なものを指すが、ここでは「コードを解析するツール」程度の意味。
コード
グリーンスパンの第10法則
グリーンスパンの第10法則
十分に複雑なCまたはFortranのプログラムは全て、後付けで
正式な仕様がなく、バグがてんこもりの遅いCommon Lisp
の半分の実装を含んでいる
“
グリーンスパンの第10法則
十分に複雑なCまたはFortranのプログラムは全て、後付けで
正式な仕様がなく、バグがてんこもりの遅いCommon Lisp
の半分の実装を含んでいる
“
十分に複雑なLispのコード解析器は全て、後付けで正式な仕
様がなく、バグがてんこもりの遅いLispの半分の実装を含ん
でいる…?
グリーンスパンの第10法則
‣ LisperもまたLispを(ムダに)再実装している
‣ 共通で使える汎用的なしくみは用意できないのか?
十分に複雑なCまたはFortranのプログラムは全て、後付けで
正式な仕様がなく、バグがてんこもりの遅いCommon Lisp
の半分の実装を含んでいる
“
十分に複雑なLispのコード解析器は全て、後付けで正式な仕
様がなく、バグがてんこもりの遅いLispの半分の実装を含ん
でいる…?
JavaScriptの場合…
‣ Esprima:汎用的なJSコード解析器
‣ 多くのJS CASEツールがEsprima上に実装されている
‣ Lispの場合はマクロがあるので、問題はこんなに簡単で
はない(が目指す状況はこんな感じ)
処理系ごとの対応
‣ コード解析は処理系におまかせ、という手もある?
• (例)いくつかのCL処理系は独自にテストカバレッジ機能を提供
• 他の機能についても処理系の対応を待つ…?
‣ 言語機能自体はマクロで拡張できるのに、コード解析に
ついては処理系の対応待ちが必要というのは歯がゆい
では、どうするか?
‣ 標準化
• Schemeのシンタックスオブジェクト的な方向性はよさそう
• Common Clojure Source Metadata Model
‣ 汎用的なコード解析器
‣ 解析器が解析しやすいコードをプログラマが書く
• スタイルだけで解決できる問題か?
• 解析しやすいようにアノテーションをつける?
‣ etc.
まとめ
‣ コードをプログラマと処理系だけが読めればいい時代は
すでに終わり
‣ CASEツールの解析で必要なのは「プログラマがどうい
うコードを書いたか」
‣ マクロがあることを口実にまともにコード解析できない
現状から逃げ続けていいのか?

Contenu connexe

En vedette

A little exercise with clojure macro
A little exercise with clojure macroA little exercise with clojure macro
A little exercise with clojure macroZehua Liu
 
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013Leonardo Borges
 
不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsして不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsしてmitsutaka mimura
 
Clojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMClojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMsunng87
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScriptsohta
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojuresohta
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Leonardo Borges
 
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...AboutYouGmbH
 
AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策Mogi Isamu
 
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発Mogi Isamu
 
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えようReact系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えようKazuhiro Hara
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)Jacek Laskowski
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojureAbbas Raza
 

En vedette (20)

Patterns
PatternsPatterns
Patterns
 
A little exercise with clojure macro
A little exercise with clojure macroA little exercise with clojure macro
A little exercise with clojure macro
 
Writing Macros
Writing MacrosWriting Macros
Writing Macros
 
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
 
不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsして不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsして
 
A Dive Into Clojure
A Dive Into ClojureA Dive Into Clojure
A Dive Into Clojure
 
Clojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMClojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVM
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScript
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojure
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012
 
Clojure的魅力
Clojure的魅力Clojure的魅力
Clojure的魅力
 
Clojure概览
Clojure概览Clojure概览
Clojure概览
 
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
 
AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策
 
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
 
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えようReact系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)
 
Clojure: a LISP for the JVM
Clojure: a LISP for the JVMClojure: a LISP for the JVM
Clojure: a LISP for the JVM
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
 
DSL in Clojure
DSL in ClojureDSL in Clojure
DSL in Clojure
 

Similaire à Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの

Reactive Extensionの紹介
Reactive Extensionの紹介Reactive Extensionの紹介
Reactive Extensionの紹介Dev Ogiwara
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話Preferred Networks
 
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~kmiyako
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるのYoshitaka Seo
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開Hideki Takase
 
ハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCDハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCD翔新 史
 
もしSIerのエンジニアがSRE本を読んだら
もしSIerのエンジニアがSRE本を読んだらもしSIerのエンジニアがSRE本を読んだら
もしSIerのエンジニアがSRE本を読んだらTomoki Ando
 
[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles
[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles
[DL輪読会]StyleNet: Generating Attractive Visual Captions with StylesDeep Learning JP
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作terurou
 
HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9Shoji Oshima
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングkei takakuda
 
ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)Tomoaki Imai
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
印刷APIのサポート事情 - DevRel Meetup in Tokyo #17
印刷APIのサポート事情 - DevRel Meetup in Tokyo #17印刷APIのサポート事情 - DevRel Meetup in Tokyo #17
印刷APIのサポート事情 - DevRel Meetup in Tokyo #17Yasunori Kihara
 
最新ゲームを支える文言
最新ゲームを支える文言最新ゲームを支える文言
最新ゲームを支える文言miki koganei
 
アイコンで組み立てる Spark MLlib + ETLプログラム
アイコンで組み立てる Spark MLlib + ETLプログラムアイコンで組み立てる Spark MLlib + ETLプログラム
アイコンで組み立てる Spark MLlib + ETLプログラムtatsumi_air
 
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiYuta Okamoto
 

Similaire à Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの (20)

Reactive Extensionの紹介
Reactive Extensionの紹介Reactive Extensionの紹介
Reactive Extensionの紹介
 
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
 
C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
 
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるの
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
ハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCDハッカソンに使うSwift & Swift 3.0のGCD
ハッカソンに使うSwift & Swift 3.0のGCD
 
もしSIerのエンジニアがSRE本を読んだら
もしSIerのエンジニアがSRE本を読んだらもしSIerのエンジニアがSRE本を読んだら
もしSIerのエンジニアがSRE本を読んだら
 
[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles
[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles
[DL輪読会]StyleNet: Generating Attractive Visual Captions with Styles
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
 
進化するArt
進化するArt進化するArt
進化するArt
 
HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
 
ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
印刷APIのサポート事情 - DevRel Meetup in Tokyo #17
印刷APIのサポート事情 - DevRel Meetup in Tokyo #17印刷APIのサポート事情 - DevRel Meetup in Tokyo #17
印刷APIのサポート事情 - DevRel Meetup in Tokyo #17
 
最新ゲームを支える文言
最新ゲームを支える文言最新ゲームを支える文言
最新ゲームを支える文言
 
アイコンで組み立てる Spark MLlib + ETLプログラム
アイコンで組み立てる Spark MLlib + ETLプログラムアイコンで組み立てる Spark MLlib + ETLプログラム
アイコンで組み立てる Spark MLlib + ETLプログラム
 
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
 

Plus de sohta

入門Transducers
入門Transducers入門Transducers
入門Transducerssohta
 
Clojure Language Update (2015)
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)sohta
 
入門core.async
入門core.async入門core.async
入門core.asyncsohta
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターsohta
 
ClojureではじめるSTM入門
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門sohta
 
Clojureによるバイトコードプログラミング
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミングsohta
 

Plus de sohta (7)

入門Transducers
入門Transducers入門Transducers
入門Transducers
 
Clojure Language Update (2015)
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)
 
入門core.async
入門core.async入門core.async
入門core.async
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
 
ClojureではじめるSTM入門
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門
 
Clojureによるバイトコードプログラミング
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
 

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの