Guild icon
swift-developers-japan
main / swift-zatsu
Avatar
Xcode 9.1で4.0.2がリリースされたけど、リポジトリには4.0.1, 4.0.2のリリースタグが付かないですね。 swift-4.0-branch にはバージョン変更入ってるのに。 https://github.com/apple/swift/compare/swift-4.0-RELEASE...swift-4.0-branch
swift - The Swift Programming Language
Avatar
swift-4.0.2-RELEASE来てた。
Avatar
StringStringProtocol だけど NumberNumeric なんですね… https://developer.apple.com/documentation/swift/numeric
Avatar
omochimetaru 11/6/2017 8:49 AM
XxxProtocol は Xxx をそのままプロトコル化したやつで
8:49 AM
Numeric はまた違うんじゃ?
Avatar
なんか微妙に気持ち悪いというかなんというか…?
Avatar
omochimetaru 11/6/2017 8:50 AM
Numericはもととなる型があるわけじゃなくてそれ単体で設計された何かなのでは
Avatar
StringProtocol 以外の XxxProtocol って何があります?
Avatar
NSObjectProtocol
Avatar
Avatar
omochimetaru 11/6/2017 8:52 AM
(早押しクイズかな
Avatar
一番有名で一番邪悪
Avatar
そw
Avatar
NSObjectProtocolこれ入れるとヘッダーには書いてないけど暗黙的にclass扱いになってる気がするんだよね
Avatar
ん?
Avatar
IteratorProtocol 普通にわすれてたw NSObjectProtocol なんてあるのかぁ(白目
Avatar
@tarunon https://developer.apple.com/documentation/objectivec/nsobjectprotocol
An object that conforms to this protocol can be considered a first-class object. Such an object can be asked about its:
Class, and the place of its class in the inheritance hierarchy. Conformance to protocols. Ability to respond to a particular message. The Cocoa root class NSObject adopts this protocol, so all objects inheriting from NSObject have the features described by this protocol.
8:54 AM
クラスとして振る舞うのに必要な要素がNSObjectProtocolに入ってる、って感じかしら
Avatar
んにゃ、NSObjectとして振る舞う、だね
Avatar
ああ、そうね
Avatar
omochimetaru 11/6/2017 8:55 AM
なんちゃらProtocol、意外と無いな
Avatar
暗黙的にclass扱いってどういうことだろう
Avatar
ヘッダーでは public protocol NSObjectProtocol { ってなってるのに、実際の動きは public protocol NSObjectProtocol: class { なんじゃあないのっていうのが各所で浮き出てくる (edited)
Avatar
omochimetaru 11/6/2017 8:56 AM
↑ mutating func とか絡めてみれば確認できそう
Avatar
なお
Avatar
@tarunon 浮き出てくるっていうのは実行時の振る舞いの話?
8:57 AM
コンパイラの振る舞い
Avatar
ああー
Avatar
omochimetaru 11/6/2017 8:57 AM
IteratorProtocol は、 Sequence.Iterator (associatedtype) との Iterator っていう 名前衝突を避けたくてそうなった感があるけどね・・・
Avatar
それは :class を書いたときと同じやつか
Avatar
そう、そうであるべきなのに書いてなくて卑怯だな~~ってなる
Avatar
Kishikawa Katsumi 11/6/2017 8:57 AM
NSObjectProtocolはObjCのプロトコルだからじゃないかな。
Avatar
omochimetaru 11/6/2017 8:57 AM
あ〜
Avatar
UITableVIewDelegateとかも確かそうじゃなかった?
8:58 AM
classって書いてあったっけあれ
Avatar
@objcつけたらclass矯正されるのと同じ感じですかね
Avatar
Kishikawa Katsumi 11/6/2017 8:58 AM
Swift以前からある、
Avatar
omochimetaru 11/6/2017 8:58 AM
objc側からimportされてるプロトコルは全部そうなのか。
Avatar
@objc明示ルール出来たのにNSObjectProtocolはそうじゃないっていうのもね
8:58 AM
卑怯ポイント高い
Avatar
UITableViewDelegateはNSObjectProtocolを継承(?)してた。
Avatar
Basic Arithmetic、日本語でなんてんだ
Avatar
四則演算?
9:01 AM
違うか?
Avatar
omochimetaru 11/6/2017 9:01 AM
> Weblio専門用語対訳辞書での「basic arithmetic operations」の意味 Basic arithmetic operations 四則演算
Avatar
💪 ('ω' 💪 ) (edited)
😯 1
👏 1
Avatar
あー
9:03 AM
継承はExtends、protocolの場合はどれだと思ってたら違うところ見てた。> Inherits こっちかな
Avatar
継承はinheritだね
Avatar
あれれ
Avatar
extendはどっちかというと拡張
9:04 AM
= extension
Avatar
protocolはconformじゃない?
Avatar
英語力の低さが露呈している
Avatar
omochimetaru 11/6/2017 9:04 AM
Relationships Inherits From Equatable, ExpressibleByIntegerLiteral Inherited By BinaryInteger, SignedNumeric
Avatar
プロトコルも継承でいいんでねたぶん
Avatar
omochimetaru 11/6/2017 9:04 AM
ドキュメント的には protocol のページだと inherit
9:05 AM
満たしてるProtocolについては conforms だったと思う
Avatar
プロトコルAと実装Bの関係がB conforms to AでプロトコルAの性質を引き継ぐプロトコルBはB inherits from Aのイメージだなあ (edited)
Avatar
protocolが別のprotocolを継承している場合は inherits、何かの型がprotocolに準拠している場合は conforms、多分これで問題ないかと…?
Avatar
Kishikawa Katsumi 11/6/2017 9:06 AM
Inherit, conform, extend, adoptのどれも同じ意味で使われることありますよ。アップルのドキュメント
Avatar
キビシー
Avatar
Kishikawa Katsumi 11/6/2017 9:07 AM
たぶん決まりはない、、、あるかもしれないけど書く人で変わるくらいのものじゃないかな。
Avatar
omochimetaru 11/6/2017 9:07 AM
https://developer.apple.com/documentation/swift/int あー、僕が言っていたのは文章中の英単語のことじゃなくて、↑の形式のリファレンスの、一番下の方にある機械的に書かれてるっぽいやつのことです
9:07 AM
Relationships セクションの中のサブセクションのタイトル。 (edited)
Avatar
Int は型だから protocolConforms To ですね
Avatar
omochimetaru 11/6/2017 9:08 AM
Conforms To の逆参照が Adopted From として掲載されてるっぽい
Avatar
意味的にもそれがしっくりくるね
Avatar
omochimetaru 11/6/2017 9:09 AM
protocol 同士は Inherited From と Inherited To (edited)
Avatar
Inherits from ですね
Avatar
C#のAbstract Class欲しいなぁと改めて思った https://qiita.com/taketo1024/items/71e3272211f08d7e0cde
社内の「Scala 勉強会」で Phantom Type (幽霊型) という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。 インスタンスの状態を変数ではなく **型パ...
9:44 AM
この例、Statusabstract class で定義できたらなぁとすごい思う
Avatar
omochimetaru 11/7/2017 9:45 AM
あーなるほど。
9:45 AM
この場合は、 依存型が入ってくれれば、 Status を enum にすればいいですけどね〜
Avatar
Javaのあの依存型ですか?
Avatar
omochimetaru 11/7/2017 9:46 AM
依存型は型パラメータに値が書けるやつです
9:47 AM
例えば・・・ struct StackArray<value Size: Int> { ... }
9:47 AM
みたいなノリ
Avatar
stateパターンというか列挙されたstrategyパターンというか。

環境

  • xcode 9.0
  • swift4 ## 問題

swiftのenumは要素ごとに振る舞いを定義できない

ひたすらswitch文を使...
Avatar
omochimetaru 11/7/2017 9:47 AM
var a = StackArray<2>() a.0 // ok a.1 // ok a.2 // compile error (edited)
Avatar
StackArray 欲しいw
Avatar
omochimetaru 11/7/2017 9:48 AM
↑のtaketoさんの記事なら、 enum Status { case NotReady case Ready } class Something<value T: Status> { /*中身は同じでOK*/ } (edited)
Avatar
編集リクエストを出しては?
Avatar
omochimetaru 11/7/2017 9:50 AM
いまのSwiftには無いですよ
Avatar
ああ、後ろが value T: Status になってるのか。 (edited)
Avatar
Statusprotocol じゃダメなんだっけ? sealed にできない?
Avatar
omochimetaru 11/7/2017 9:52 AM
↑最近のスレ
9:52 AM
protocol だとユーザが追加した値が入れられちゃいますね あ、abstract class でもその点がダメだな
9:52 AM
- Now you can define a “dependent type”, for example ModuloInteger<P>, where P is the integer value that defines the type. - Like this, you’ll have: —> MI<2>: {0, 1}, where 1 + 1 = 0. —> MI<3>: {0, 1, 2}, where 1 + 1 = 2, and 2 • 2 = 1
Avatar
Statusprotocol でもダメってことはないですが、Something<NotReady>.createInstance() で書かないといけないのがイケてないですね
Avatar
omochimetaru 11/7/2017 9:53 AM
↑ P で割ったあまり を表す型 ModuloInteger<P> の例 、型パラのところに2 とか 3とかの 「値」が入る
Avatar
Vector<2> とか Matrix<4, 4> とかやりたい。
Avatar
omochimetaru 11/7/2017 9:53 AM
ですね〜〜〜〜
Avatar
むしろなんでないんだろって思う
9:54 AM
そっちの方がメモリ管理も楽そうなのにな
9:55 AM
reserveCapacity とか考えなくて済む
Avatar
omochimetaru 11/7/2017 9:56 AM
単に優先度っぽいですけどね、具体的なコアチームからの反論はみてない気がする
Avatar
Generics Manifesto にもないよね?当分( Swift 5, 6 あたりで)はなさそうな気が。
9:59 AM
あった!!
10:00 AM
Currently, Swift's generic parameters are always types. One could imagine allowing generic parameters that are values, e.g.,
10:00 AM
struct MultiArray<T, let Dimensions: Int> { // specify the number of dimensions to the array subscript (indices: Int...) -> T { get { require(indices.count == Dimensions) // ... } } (edited)
10:00 AM
例もまさに Vector<N> ですね。
10:01 AM
MayBe セクションだから
10:01 AM
ワンチャンあるで〜
Avatar
てか、 Rust Like な Generic Protocol についても書いてあるな
10:03 AM
対応見込みは Unlikly になっている
10:04 AM
struct Real { ... } extension Real : ConstructibleFrom<Float> { init(_ value: Float) { ... } } extension Real : ConstructibleFrom<Double> { init(_ value: Double) { ... } } サンプルも Rust の From trait と似てる
Avatar
正直長すぎてどの項目がどの項目のサブ項目なのかわからないしOutline機能欲しい…
10:06 AM
せめてFold機能欲しい
Avatar
たしかに。限界を感じます
Avatar
上で出て来たenumstateパターン、無理やりRawValueに振る舞いを実装して見た https://gist.github.com/norio-nomura/65db97c4786851bc368a8d68834fb31b (edited)
Avatar
https://qiita.com/taketo1024/items/71e3272211f08d7e0cde 例のこのPhantom Typeのやつ、extensionで where T: Ready で書くと問題ないけど、where T == Ready で書くと Something.createInstance() の直後でも変換の補完で .shout() が出るのなんで?(もちろんコンパイルエラーにはなるけど…)
社内の「Scala 勉強会」で Phantom Type (幽霊型) という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。 インスタンスの状態を変数ではなく **型パ...
1:33 PM
これのせいで微妙に辛いのはStatusがstructで作りにくい…
Avatar
@omochimetaru おもちのgysb、他のファイルにあるSwiftのメソッドとか呼べる?
Avatar
omochimetaru 11/8/2017 3:16 AM
呼べません
3:16 AM
呼びたい?
3:17 AM
いまは変換して作られたswiftコードを $ swift generate.swift で実行しているだけなんや。
Avatar
僕が普段gyb使うケース、gybのテンプレートからpythonで書いたSwaggerのyamlのパーサーをimportして使ってるので、それができれば嬉しみって感じ
Avatar
omochimetaru 11/8/2017 3:19 AM
そもそもswiftには隣においてあるファイルを読み込む機能とかないから
3:19 AM
どうやるのがいいか悩むね。
Avatar
インタプリタ実行じゃ無理か
Avatar
omochimetaru 11/8/2017 3:19 AM
gysb側で % include "./hoge.swift" みたいな機能を追加して
Avatar
無理やり展開する?
Avatar
omochimetaru 11/8/2017 3:20 AM
テキストとしてそのままぶち込むのはどうか
3:20 AM
古き良きプリプロセッサ
Avatar
なんとなく動きそうな感じはする
Avatar
omochimetaru 11/8/2017 3:20 AM
issueにしとく いまちょっとパーサーを直さなきゃいけないことに気がついたからあとまわし
3:21 AM
わしもあとでgysbのコードちゃんとよむね
Avatar
omochimetaru 11/8/2017 3:21 AM
いま最新コミット完全にぶっ壊れてるから一個前を見てw
Avatar
Avatar
omochimetaru 11/8/2017 3:21 AM
ちょっと保存するのにうっかりmasterにやっちまった
Avatar
0.1.0のタグ打とう
Avatar
omochimetaru 11/8/2017 3:21 AM
たしかに。
3:22 AM
うった
Avatar
omochimetaru 11/8/2017 3:59 AM
あれ、swift runが壊れた。
Avatar
omochimetaru 11/8/2017 4:14 AM
0.2.0 できた。
4:15 AM
%{ let intTypes = [8,16,32,64] }% % for intType in intTypes { % for sign in ["", "U"] { /// Extension that adds a few additional functionalities to ${sign}Int${intType} extension ${sign}Int${intType} { /// Returns a ${sign}Int${intType} with all ones % if sign == "" { public static var allOnes: Int${intType} { return Int${intType}(bitPattern: UInt${intType}.max) } % } else { public static var allOnes: UInt${intType} { return UInt${intType}.max } % } } % } % }
Avatar
すぐ API のミスに気づいたりするから、とりあえず -alpha とか -beta つけるのオススメ。
Avatar
omochimetaru 11/8/2017 4:16 AM
↑これ綺麗に出力できる モアイさんの例↓ http://moapp.hateblo.jp/entry/2017/06/30/210636
Swift gybの環境構築 ふとSwiftのgybが気になったので環境構築を試して見ました gybとは Swift言語開発の副産物のメタプログラミングツールgybがとても良い— おもちメタル (@omochimetaru) 2017年6月30日 gybは「Generate Your Boilerplate」の略称みたいです(gyb --helpより) 具体的に何かと言うと、Swiftの公式リポジトリの中でSwiftコードの自動生成に使われているPython製のテンプレートエンジンになります gybを導入する qiita.com というわけで、こちらを参考に環境構築して見ました まずgyb自体…
4:17 AM
ふむう > alpha
Avatar
gyb よく知らないけれどマクロ的なやつなのか
Avatar
テンプレートエンジン?
Avatar
omochimetaru 11/8/2017 4:17 AM
↑のモアイさんの記事読むと良いよ
4:18 AM
func readToken() -> Optional<Token> を func readToken() -> Token に変えて、 enum Token に case end を足したらすごく良くなった https://github.com/omochi/gysb/blob/master/Sources/gysb/Token.swift#L18
gysb - Generate your swifty boilerplate
Avatar
よんだ
4:19 AM
なるほど
Avatar
omochimetaru 11/8/2017 4:20 AM
とても良いツールなんだけど
4:20 AM
pythonを書かされるという致命的な問題点があるので
4:20 AM
それを解決したのが拙作のgysbですw
Avatar
なるほどアツい
Avatar
ただ、 Python なのも良いところがあって、 Swift のコードの合間に書かれているときはぱっと見で Python の方が区別しやすいかも?
Avatar
脳のスイッチングコストは結構でかいです
Avatar
omochimetaru 11/8/2017 5:26 AM
まあ僕はガチャガチャ複数言語書くの慣れてるけど
5:26 AM
ひらりとかそもそもパイソン書いたことなかったよね。
Avatar
うん
5:27 AM
gybのために嫌々始めた
Avatar
omochimetaru 11/8/2017 5:27 AM
Avatar
確かに Python を知らない人にとってはハードルが高いな。
5:29 AM
しかも end とか Python じゃないし。
Avatar
イニシャライザちゃんと書かないとプロパティがあったりなかったりするのすごくキツイんだけど何か間違ってるのかもしれない
Avatar
omochimetaru 11/8/2017 5:31 AM
pythonになってるメリットはwindowsとかでも動くことだと思います
Avatar
まあ、 Swift が動かない環境で Swift で書くツールを使おうとしないでしょう・・・。
Avatar
omochimetaru 11/8/2017 5:33 AM
swiftコンパイラ本体の開発は まだ動いてない環境でswiftを動かすタスクだから
5:33 AM
swiftに依存しないでswiftを作らないといけないけど
5:33 AM
たしかに、コンパイラじゃなくてswiftアプリケーションを作る場面なら
5:33 AM
swiftに依存してても問題ないですねw
Avatar
コンパイラ開発であっても、プログラミング言語はある程度固まってきたらセルフホスティングになることも多いし、 gyb レベルならもう Swift でいい気がする。 (edited)
Avatar
omochimetaru 11/8/2017 5:42 AM
セルフホスティングになった言語って
5:42 AM
まだコンパイラをビルドしてない新しい環境に対応するときはどうすんだろ
5:43 AM
昔のC++の実装で、古いバージョンをコンパイルしてから、 その古いバージョンを使って最新のバージョンをセルフコンパイルする?
Avatar
一回でいけるのかな
Avatar
yutailang0119 11/9/2017 1:17 AM
セルフホスティングになると何がメリットなんだろう、コンパイラもSwiftで書かれてるからメンテしやすいとか? Goがセルフホスティングになった時に、話題にはなっていたけど、いまいち理解できてない
Avatar
omochimetaru 11/9/2017 2:13 AM
その言語が、コンパイラを書くのに向いてるのであれば、コンパイラの保守性が上がると思います でも半分はロマンな気がする・・・
Avatar
Kishikawa Katsumi 11/9/2017 2:25 AM
ロマン いつかはセルフホスティングみたいなのはある気がする。
Avatar
この言語自身で効率的にコンパイラを書け、そのコンパイラのパフォーマンスも良いのであれば、その言語のその分野での有効性を示せるとは思います。
2:47 AM
「その分野での」と書きましたが、コンパイラのコードは複雑なのでそれがキレイに書けるのは言語の記述能力の高さを示せそうだし、コンパイラにはパフォーマンスも求められるので、ローレベルからハイレベルまで幅広い範囲で有効性を示そうな気がします。そして、 Swift はまさにそれに向いている言語だと思うので、どこかの段階でセルフホスティングになってほしいですねぇ。まだ時期尚早だとは思いますが。
👀 1
Avatar
omochimetaru 11/9/2017 2:51 AM
Swiftコンパイラのアーキテクチャでいうと LLVM をライブラリとしてガシガシに使っているから
2:51 AM
C++ Interop が実現されるか、もしくは、
2:52 AM
LLVMをSwift化するか・・・
Avatar
https://github.com/trill-lang/LLVMSwift 完全ではないけど、LLVM ラッパ的なプロジェクトはありまっせ。 (edited)
LLVMSwift - A Swift wrapper for the LLVM C API (version 5.0)
Avatar
omochimetaru 11/9/2017 3:10 AM
マジか
3:10 AM
Authors Harlan Haskins (@harlanhaskins) Robert Widmann (@CodaFi)
3:10 AM
コダフィ氏だ
Avatar
ちゃんと SwiftPM 準拠だ。
Avatar
norio_nomura 11/9/2017 4:01 AM
Swift 4.0.2に-swift-version 3を渡してるかどうかは #if swift(>=3.2.2) で判定。 (edited)
Avatar
yutailang0119 11/9/2017 5:37 AM
なるほどw > ロマン
Avatar
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20171106/041072.html
FWIW, I’m getting optimistic about moving to a forum soon.
Ted から久々にフォーラム移行についての言及。まだまだ曖昧。
Avatar
omochimetaru 11/9/2017 7:29 AM
早くしてほしい・・・ ログが調べにくいせいからか話題がループしてるのを感じる
7:34 AM
@hiragram include実装したよ
Avatar
おっ
7:35 AM
@omochimetaru SwiftってJSONは読めるけどYAMLは読めないよね確か
Avatar
omochimetaru 11/9/2017 7:35 AM
なんのこっちゃ
7:36 AM
FoundationにYAMLのなんかがあるかってこと?
Avatar
わしのgybのユースケースでgysbに置き換えるならgysbファイルからincludeした先でSwaggerのymlをパースする必要がある
Avatar
omochimetaru 11/9/2017 7:38 AM
ンゴ・・・
7:39 AM
yamlのライブラリをソースとして隣においておいて
7:40 AM
元のジェネレータで全部includeする形で対応になる
Avatar
なるほろ
7:40 AM
まあSwaggerのymlをjsonに変換しちゃうのもあり
Avatar
omochimetaru 11/9/2017 7:40 AM
それだったらincludeいらないやんけ
Avatar
いやいるよ
Avatar
omochimetaru 11/9/2017 7:41 AM
なんでだっけ
Avatar
jsonをdictionaryにしたとしてそれをそのままテンプレート側で値取ってくるのしんどいでしょ
Avatar
omochimetaru 11/9/2017 7:41 AM
ああ、jsonを取り回すユーティリティがほしいのか。
Avatar
そう
Avatar
omochimetaru 11/9/2017 7:41 AM
理解
Avatar
omochimetaru 11/9/2017 9:04 AM
@hiragram
Avatar
はーい
Avatar
omochimetaru 11/9/2017 9:04 AM
gysb - Generate your swifty boilerplate
9:04 AM
[omochi@omochi-iMac gysb (master *+=)]$ cat Examples/include.swift.gysb %! include_code("libs/*.swift") % aaa=${aaa()} bbb=${bbb()} [omochi@omochi-iMac gysb (master *+=)]$ swift run gysb Examples/include.swift.gysb aaa=999 bbb=777
Avatar
%!
9:05 AM
メタofメタ
Avatar
omochimetaru 11/9/2017 9:05 AM
%! と include_code を追加したのでなんとかなる
Avatar
良い
Avatar
omochimetaru 11/9/2017 9:05 AM
ワイルドカード対応したから
Avatar
おおっ
Avatar
omochimetaru 11/9/2017 9:05 AM
あとは試してみて
Avatar
master *+= ってなんや💢て思ったけどプロンプトだった
Avatar
omochimetaru 11/9/2017 9:06 AM
ほんとだw
9:06 AM
汚いスクショになってしまった。
Avatar
norio_nomura 11/9/2017 9:06 AM
ああ、libYAMLを使ってるYamsは使えなさげ。
Avatar
omochimetaru 11/9/2017 9:06 AM
swiftソースをテキスト展開してるだけなので
9:06 AM
リンクが必要だとダメですね・・・
9:07 AM
%! swift_package("Package.swift") とか定義しておくと SPM の executable として実行するような機能を作ったら対応できそう。
Avatar
%{...}の中にimportは書けないのか
Avatar
どんどん大掛かりになってる・・・
Avatar
omochimetaru 11/9/2017 9:10 AM
%{...}の中にimportは書けないのか
Swiftのimportは書けるよ。
9:10 AM
import Foundation とかはできる。
9:10 AM
swift コマンドで何もしないでも import できるものはimportできるってこと
9:10 AM
[omochi@omochi-iMac gysb (master=)]$ swift run gysb --compile Examples/include.swift.gysb func write(_ s: String) { print(s, terminator: "") } func aaa() -> Int { return 999 } func bbb() -> Int { return 777 } write("aaa=") write(String(describing: aaa())) write("\n") write("bbb=") write(String(describing: bbb())) write("\n")
9:11 AM
swiftc みたいに、途中の段階で実行を止める機能を作ったので
9:11 AM
たのしいです
9:11 AM
--parse , --macro , --compile , --render と4ステージあります
9:14 AM
swift コマンドの -Xlinker だけ指定できれば libYAML はいけるかな・・・?
Avatar
norio_nomura 11/9/2017 9:14 AM
gysbがライブラリになっていて、.gysbインプットから.swiftStringを作れるAPIがあると、swift testの度に.swiftを生成する事ができる様になります。 (edited)
Avatar
omochimetaru 11/9/2017 9:14 AM
MSVCがソースファイルのなかに #comment(lib, "GL.h") ってかいてリンク指定できるみたいな。 (edited)
Avatar
norio_nomura 11/9/2017 9:15 AM
Yamsは*.cをパッケージ内に持ってて、SwiftPMにClangモジュールとしてビルドしてもらってます。
Avatar
omochimetaru 11/9/2017 9:16 AM
いまここが、コンパイラのstdout / stderr を、そのまま垂れ流しにしちゃっているので
9:16 AM
ここをキャプチャしてやれば
.gysbインプットから.swiftのStringを作れるAPI
もいけそうです
9:17 AM
あー、Cソースも持っているのか。それはもうSPMとして全体を実行する以外無理そうだなあ
9:17 AM
ひらりの要望だけで無限にシステムが複雑になったw
Avatar
norio_nomura 11/9/2017 9:18 AM
w
Avatar
いいぞいいぞ〜❗
Avatar
omochimetaru 11/9/2017 9:18 AM
効率悪いのが、一個のテンプレートの処理のたびに spm package つくることになっちゃって
9:18 AM
依存ライブラリを取り直しまくることになるんだよなあ
9:18 AM
いまは トップレベルで printするSwiftソースとしてコンパイルしているけど
9:18 AM
ひとつのファイルの処理結果を得る関数をもったSwiftソースとしてコンパイルして
9:19 AM
入力のテンプレートファイル全部を関数としてまとめて一個のバイナリにした上で
9:19 AM
それぞれ出力する、みたいな形にすると、それ系をまとめられるが・・・・
Avatar
norio_nomura 11/9/2017 9:22 AM
Xcodeで使う分にはRun Script Phaseを使えるからCLIでいいけど、SwiftPMはビルドプロセスに入れられないのがネックだね。
Avatar
omochimetaru 11/9/2017 9:23 AM
あ、そもそも、 gysb を SwiftPM のビルドに差し込めない問題の話ですか。
9:24 AM
そこはもう gysb と 変換先の swift を両方コミットしてもらうしかないっすねえ・・・
9:25 AM
まあそれは今のgyb使ってるやり方でも同じことで(Vapor Cloudにデプロイするのに vapor build の手前に処理を差し込む方法ないのって問い合わせたらねえって言われた (edited)
Avatar
omochimetaru 11/9/2017 9:27 AM
vapor build ってコマンドで全てを発火するの?
Avatar
ん?
9:28 AM
vapor cloud deploy するとリモートでチェックアウトして vapor build が動くんだけどその手前でコードジェネレータ動かしてもらわないと成果物コミットしてないから当然コンパイル通らない
Avatar
omochimetaru 11/9/2017 9:28 AM
んーっと vapor build は 内部で swift build をする、みたいな感じかなと
Avatar
そう
Avatar
omochimetaru 11/9/2017 9:28 AM
あー リモートでデプロイするためのコマンドが手前側にあって
9:28 AM
リモートはvapor build をするのか
Avatar
そうそう
Avatar
omochimetaru 11/9/2017 9:28 AM
うわ〜 それだと何もさせないね
9:29 AM
せめてローカルのvapor build ならオレオレbuildを叩くようにすれば手前にはさめたけど
9:29 AM
向こう側はどうしようもなさ
Avatar
コミットするしかないんやろかとなって一旦デプロイ周りは棚上げしといた
Avatar
omochimetaru 11/9/2017 9:29 AM
でもそれだと、CSS Spriteとか
Avatar
VaporのSlackで聞いたら「今は無いけど将来やりたいねそれ」って言ってた
Avatar
omochimetaru 11/9/2017 9:29 AM
なんか他にもいろんな前処理したいときにできなくね?
9:29 AM
あ、そういうのはコンパイル後だからなんとかなるのかな?
Avatar
そもVaporアプリ自体のコンパイルに必要でなければあとでも良い気がする。
Avatar
omochimetaru 11/9/2017 9:30 AM
リソースはvapor buildとは別に用意したらいいのか。
Avatar
そね
10:53 AM
テストできるようになりました。
👍 1
🎊 1
Avatar
環境変数を使ってPackage.swiftの内容を切り替え、GYSB=1 swift testでコード生成し、swift testで生成したコードを利用する方法を思いついた。
Avatar
あー たしかにテスト実行中にソースを書き出せば、、、
Avatar
テストターゲットを生成用と利用用に分ける方法も考えたけど、swift test --filter Generateとテストするモジュールを制限しても全てをビルドしようとするから、未生成なコードに依存する部分がビルド出来なくてダメだった。
Avatar
そうか、テストターゲットじゃないと、実行ができないのか
Avatar
// swift-tools-version:4.0 import PackageDescription import Foundation let package: Package if ProcessInfo.processInfo.environment["GYSB"] != nil { package = Package( name: "Generate", dependencies: [ .package(url: "https://github.com/omochi/gysb.git", .branch("master")), ], targets: [ .testTarget(name: "Generate", dependencies: ["GysbKit"], path: "Tests/GenerateTests") ] ) } else { package = Package( name: "Example", products: [ .library(name: "Example", targets: ["Example"]), .library(name: "Generated", targets: ["Generated"]), ], targets: [ .target(name: "Example", dependencies: ["Generated"]), .target(name: "Generated", dependencies: []), .testTarget(name: "ExampleTests", dependencies: ["Example"]), ] ) }
11:19 AM
$ tree . ├── Package.resolved ├── Package.swift ├── README.md ├── Sources │   ├── Example │   │   └── BuildPhase.swift │   └── Generated │   └── vector.swift └── Tests ├── ExampleTests │   └── ExampleTests.swift ├── GenerateTests │   └── GenerateVectorTests.swift └── LinuxMain.swift こんな感じ (edited)
11:22 AM
あ、テンプレートを別の場所に置かないとダメだ。
Avatar
norio_nomura 11/9/2017 1:31 PM
Package.swiftYamsをビルドして、それを.gysbの中でインポートしようとしてるのだけど、うまくいかないな。
1:32 PM
Test Case '-[GysbWithYamsTests.GysbWithYamsTests testExample]' started. process execution failure path=[/usr/bin/swift] arg[0]=[/var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift] arg[1]=[-L] arg[2]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] statusCode=[1] stderr= /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift:4:9: error: no such module 'Yams' import Yams ^ Test Case '-[GysbWithYamsTests.GysbWithYamsTests testExample]' passed (0.438 seconds).
Avatar
omochimetaru 11/9/2017 1:32 PM
$ /usr/bin/swift /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_49IokLMk.swift
1:32 PM
↑これを実行しているだけだから、フレームワークサーチパス的なところで
1:33 PM
ビルド済みのYamsが見えていないと
1:33 PM
見つけられないです
Avatar
norio_nomura 11/9/2017 1:33 PM
とりあえずこんな感じで起動してます。 return try execCapture(path: swiftPath, arguments: [path, "-L", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug"]) (edited)
Avatar
omochimetaru 11/9/2017 1:34 PM
ああなるほど。
1:34 PM
ほんとだ、よくみてなかった。
1:34 PM
とりあえず、直接swiftコマンドで実行できるコマンドを
1:34 PM
見つけるのが良さそう
1:34 PM
-F <value> Add directory to framework search path
1:35 PM
.frameworkならこっちですよ。
1:35 PM
static libarryなら、 -L <value> Add directory to library link search path -l<value> Specifies a library which should be linked against これらの併用がひつよう
1:35 PM
フレームワークの場合に -l も必要だったかはよくわからない
Avatar
norio_nomura 11/9/2017 1:45 PM
-I…,-L…,-F…つけても、YamsのPackage.swiftでライブラリtypeを.static.dynamicにして-lYamsつけてもダメだ。 path=[/usr/bin/swift] arg[0]=[/var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_NwwoI7hu.swift] arg[1]=[-I] arg[2]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[3]=[-F] arg[4]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[5]=[-L] arg[6]=[/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug] arg[7]=[-lYams] statusCode=[1] stderr= /var/folders/kt/2mwy9b_56_7993x190pl_1fh0000gn/T/vector_NwwoI7hu.swift:4:9: error: no such module 'Yams' import Yams (edited)
Avatar
omochimetaru 11/9/2017 1:46 PM
うへえ
Avatar
norio_nomura 11/9/2017 1:47 PM
ああ、ソースコードのパスを引数の最後に持ってきたら通った。
Avatar
omochimetaru 11/9/2017 1:48 PM
おお。
Avatar
norio_nomura 11/9/2017 1:59 PM
Yamsのlibrary typeを.dynamicにして、以下のオプションをswiftに渡したらいけた。 return try execCapture(path: swiftPath, arguments: [ "-I", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug", "-L", "/Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug", "-lYams", path, ])
Avatar
omochimetaru 11/9/2017 1:59 PM
-I と -L は両方そこでいいんですね
Avatar
norio_nomura 11/9/2017 2:00 PM
テンプレートはこんな感じ % import Foundation % import Yams % guard let yaml = try Yams.compose(yaml: String(contentsOf: URL(fileURLWithPath: "TestResources/vector/vector.yml"))) else { fatalError() } % let vars = yaml.array().flatMap { $0.string } % for n in 2...4 { struct Vector${n} { % for i in 0..<n { var ${vars[i]}: Float % } } % }
Avatar
omochimetaru 11/9/2017 2:00 PM
これは、アプリのプロジェクトのPackage.swiftで、Yamsとgysbの両方を依存させていて、 swift run gysb が通る状態?
Avatar
norio_nomura 11/9/2017 2:01 PM
// swift-tools-version:4.0 import PackageDescription let package = Package( name: "GysbWithYams", dependencies: [ .package(url: "https://github.com/omochi/gysb.git", .branch("master")), .package(url: "https://github.com/jpsim/Yams.git", .branch("master")), ], targets: [ .testTarget( name: "GysbWithYamsTests", dependencies: ["GysbKit", "Yams"]), ] ) class GysbWithYamsTests: XCTestCase { func testExample() { do { let driver = Driver.init(path: "TestResources/vector/vector.swift.gyb") let actual = try driver.render(to: .render) print(actual) } catch { print(error) } } static var allTests = [ ("testExample", testExample), ] } (edited)
Avatar
omochimetaru 11/9/2017 2:02 PM
なるほど
Avatar
norio_nomura 11/9/2017 2:07 PM
SwiftPMはライブラリプロダクトのtypeが未指定でもリンクしてくれますが、この使い方の場合、libYams.alibYams.dylibが無いとダメですね。
2:08 PM
type: .staticでも本当はいけると思うのですが、swiftcがクラッシュしてしまいダメでしたが。
Avatar
omochimetaru 11/9/2017 2:08 PM
なるほど〜
2:09 PM
SwiftPMのデフォルトは .static なんですか?
Avatar
norio_nomura 11/9/2017 2:10 PM
Swift 4からデフォルトではライブラリを生成しなくなりました。
Avatar
omochimetaru 11/9/2017 2:10 PM
ほう
Avatar
norio_nomura 11/9/2017 2:10 PM
ライブラリを構成する.o達を直接リンクします。 (edited)
Avatar
omochimetaru 11/9/2017 2:10 PM
マジか
2:10 PM
あーシンボルはパッケージで切ってるからいいじゃんってか
2:11 PM
Cとはちょっと違う世界に進みつつありますね
Avatar
norio_nomura 11/9/2017 2:11 PM
swift test -vとかしてみるとコンパイラの起動オプションを見られます。
2:15 PM
type: .dynamicにするとswift build --static-swift-stdlibとかしてもそれらのライブラリはダイナミックリンクされるみたいだから、今後は使い勝手が悪くなると避けられるんじゃないかな? (edited)
Avatar
omochimetaru 11/9/2017 2:18 PM
うーむ、そうなんですかね Swiftが出てきたころから基本dynamic frameworkとembeddedだったから (edited)
2:18 PM
てっきりそういう思想なのかと思っていたけど
2:18 PM
最近static系のサポートも強くなってきていますね
Avatar
norio_nomura 11/9/2017 2:37 PM
.dynamicなライブラリを同じパッケージ内のexecutableターゲットから使う場合は問題ないのですが、依存しているパッケージから使った場合、それらはフルパスでリンクされてしまい、ポータブルなexecutableではなくなってしまいます。 $ otool -L ./.build/x86_64-apple-macosx10.10/debug/gysbClient ./.build/x86_64-apple-macosx10.10/debug/gysbClient: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1445.12.0) /Users/norio/github/GysbWithYams/.build/x86_64-apple-macosx10.10/debug/libGysbKit.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0) (edited)
Avatar
omochimetaru 11/9/2017 2:38 PM
ふむ
Avatar
前も書いたけど、 gyb でなくても Swift で Multiline String Literal が追加されたから、↓みたいな感じで大体いける気がする。これならなんでもフルに Swift の機能使える。 prefix operator > prefix func >(value: String) { print(value) } let intTypes = [8, 16, 32, 64] for intType in intTypes { for sign in ["", "U"] { >""" /// Extension that adds a few additional functionalities to \(sign)Int\(intType) extension \(sign)Int\(intType) { /// Returns a \(sign)Int\(intType) with all ones """ if sign == "" { >""" public static var allOnes:Int\(intType) { return Int\(intType)(bitPattern: UInt\(intType).max) } """ } else { >""" public static var allOnes:UInt\(intType) { return UInt\(intType).max } """ } >""" } """ } } (edited)
2:56 PM
元の gyb は↓。 %{ intTypes = [8,16,32,64] }% % for intType in intTypes: % for sign in ['','U']: /// Extension that adds a few additional functionalities to ${sign}Int${intType} extension ${sign}Int${intType} { /// Returns a ${sign}Int${intType} with all ones %if sign == '': public static var allOnes:Int${intType} { return Int${intType}(bitPattern: UInt${intType}.max) } %else: public static var allOnes:UInt${intType} { return UInt${intType}.max } %end } %end %end
Avatar
gysb - Generate your swifty boilerplate
😎 1
Avatar
SwiftPM対応できた
5:52 AM
%! swift_config("gysb_swift_config.json") %{ import Foundation import Yams let yamlPath = URL.init(fileURLWithPath: "data.yml") let yamlStr = try! String(contentsOf: yamlPath, encoding: .utf8) let yaml = try Yams.compose(yaml: yamlStr)! let fields: [String] = yaml.array().map { $0.string! } }% struct Data { % for field in fields { var ${field}: String % } }
5:53 AM
json { "packageDependencies": [ { "url": "https://github.com/jpsim/Yams.git", "requirement": { "identifier": "0.5.0", "type": "exact" } }, ], "targetDependencies": [ { "name": "Yams" } ] }
Avatar
おお、すげー!
Avatar
実行時に複数ファイル指定した場合は、一つのSwiftPMターゲットにまとめるから、Yamsの取得やビルドは共有される ただし、 %! swift_config() の指定は1ファイルだけがする。
Avatar
@omochimetaru 使う側はどこで Package.swift 指定するの?コマンドオプション?
Avatar
↑にはったjsonを書く。
Avatar
ああ、↓に書くのか。 %! swift_config("gysb_swift_config.json")
Avatar
昨日僕が無理やりswiftのコマンドラインオプションでやってたことを、全部SwiftPMへ丸投げしたということですね。 👍
Avatar
ですね SPMのワークスペースを作って、execターゲットのmain.swiftを生成するようになりました
Avatar
@omochimetaru Package.swift 的に、 gybs.json をディレクトリにおいておけば自動的に反映とかが良くないかな?そうすれば gysb ファイルに余計なものを追加しなくて良くて、gyb を Swift にしただけという体を保てそう。 (edited)
6:02 AM
ただし、 %! swift_config() の指定は1ファイルだけがする。
これも結構罠になりそう。
6:02 AM
a と b で同じライブラリが必要だけど、 a だけ、 b だけ、 a と b 同時に、って gysb に渡すときに全部サポートすることができなさそう🤔
Avatar
ディレクトリにおいておくっていうのが悩ましくて source/fooModule/foo.swift.gysb source/barModule/bar.swift.gysb ってなってるときに $ gysb source/fooModule/foo.swift.gysb って指定すると、 gysb.json はどこにあるんだ?ってなっちゃうんですよね
Avatar
source/fooModule/gybs.json じゃないかなぁ
6:05 AM
それか、Package.swift と同じ階層におくことにするか。
Avatar
それは場合によっていて、 source/ ** / * .gysb をドカンとツリー変換したい場合もあるだろうから
Avatar
%! import("https://github.com/jpsim/Yams.git") とかするとswift_config()に渡すjson相当のものが自動で生成される様にするとか。
Avatar
$ gysb --config source/gysb.json source/fooModule/foo.swift.gysb こういう感じはできるけどコマンドラインを長くしたくない・・・
Avatar
↑それだとファイルとライブラリの関係を示せない
Avatar
これも結構罠になりそう。 a と b で同じライブラリが必要だけど、 a だけ、 b だけ、 a と b 同時に、って > gysb に渡すときに全部サポートすることができなさそう
configが同じファイルならOKにするか
Avatar
利用側がどの gysb.json を使えばいいかわからないから
Avatar
同じconfigになっているソースがまとめて指定される限りOK
6:07 AM
これだとソースが自己言及的にできる
Avatar
対象となる gysb ファイルから遡って、 Package.swift と同じ階層までの gysb.json を適用するとかどう? (edited)
6:08 AM
ああ
6:08 AM
そうか
6:08 AM
別に Swift 限定じゃないから
Avatar
%! import("https://github.com/jpsim/Yams.git") とかするとswift_config()に渡すjson相当のものが自動で生成される様にするとか。 これの問題点は、パッケージ名からターゲット名がわからないこと
6:08 AM
そう、あと、生成テンプレートはSwiftに依存させたくないから
6:08 AM
Package.swiftを探すとかは マッチしない場合も多そう
Avatar
なるほど。
Avatar
gyb って import 使えるんだっけ?
6:09 AM
使えるなら参考にできるかも?
Avatar
つかえます
Avatar
gybは使えますね、pythonの言語機能のimportが使える。
Avatar
たとえば、パスの通ってるところに
Avatar
Swiftのimportはファイルパス的なしくみじゃないからできない。
Avatar
Foo.framework を置いてある前提にするとか?
6:10 AM
あー,
6:10 AM
Swift PM に乗っかって実行してるんだっけ?
Avatar
そうそう。
Avatar
それなら無理か。
6:10 AM
お、じゃあ
Avatar
libSwiftPMが気軽に使えれば「リポジトリからPackage.swiftを解釈して〜」とか簡単に出来そうなのに… https://github.com/apple/swift-package-manager/blob/master/Package.swift#L19
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
gysb を実行したディレクトリが対象となるファイルの先祖ディレクトリの場合、
6:11 AM
対象ファイルのディレクトリからカレントディレクトリまで遡って探すとかは?
Avatar
SwiftPMにgysb機能を載せた方が早そうな気がしてきた。
Avatar
そうすれば SwiftPM 対応のリポジトリで、リポジトリのルートに gysb.json おいて一括実行とかもできる
Avatar
現状の仕様で、テンプレート側から
6:13 AM
gysb.json を指定していれば
6:13 AM
それでスッキリしてません?
6:13 AM
探索するとかは、Swift以外の利用時に無駄な処理になるし
6:13 AM
カレントディレクトリの影響をうけずにコマンドラインだけで一貫した結果がいい
Avatar
@omochimetaru これを swift リポジトリ本体に組み込むことを目指すなら、できるだけ gyb に寄せておいた方が受け入れられる気がして、余計なものを付けない方がいいかなぁと。
6:14 AM
↓この記法一つで議論の余地がいくらでもあると思うので。 %! swift_config("gysb_swift_config.json")
Avatar
Swift本体に組み込む事は目指してなかったですね、Swiftソース以外の生成も前提にしているから、そこで設計方針がかみあわないのか
6:15 AM
個人的にはC++の生成にも使いたいのです
Avatar
Swiftのコンパイル時にSwiftが必要になるから、gybの代替にはなれない気がする
Avatar
セルフホスティングはまだ早いと思いますが、gyb 程度の用途だったらいけそうな気も。
Avatar
Swift本体とは独立したテンプレートエンジンとして存在してもらうほうが使う側としては嬉しみ
Avatar
↓この記法一つで議論の余地がいくらでもあると思うので。
そうですねえ、ここにマイクロ言語が必要になっているのは微妙ではある
Avatar
独立して使えるけど、それを swift リポジトリでも使うという状況を想定してます。
Avatar
brew install gysbできる様になると良いね。
Avatar
いま %! swift_config 以外に %! include_code っていうマクロ命令もあって
Avatar
それはしたい < brew
Avatar
それで他のSwiftソース(テンプレートロジックの方)を取り込んだりできるんですが
6:18 AM
この機能のためにどうしてもミニ言語が必要に。
Avatar
include_code はカオス度が増しそうだなぁ。
6:18 AM
↑例
6:19 AM
"libs/*.swift" に書いてある func aaa() {} と func bbb() {} がここにテキスト展開される。
Avatar
色々な機能を入れると混沌とするから、必要最小限なものをシンプルに保つのが良さそうな。サードパーティライブラリが使いたいのはわかるから、そこはなんとかするとして。
Avatar
Swiftがスクリプティングサポートを充実して
6:20 AM
ソースコードの相対パスimportができれば
6:20 AM
こんなものはいらなかったんだ
Avatar
gysb の実行を Swift PM に依存しない方法はないかな?
Avatar
さっきのYamsの例(Swift製YAMLライブラリ)だけみても
6:21 AM
かなりきついですね
6:21 AM
Cソースとかも絡んでいるので。
Avatar
swift コマンドで Framework のパス指定して実行できなかったっけ?
6:21 AM
ライブラリのビルドは Swift PM でやるとして
Avatar
その辺り、昨夜僕が試しました。
Avatar
gysb が生成したコードの実行を Swift PM に依存しない
Avatar
Frameworkがdynamicかstaticかで渡し方が変わったり
Avatar
結論としては、ライブラリの配布元でのPackage.swiftによりswiftコマンドラインオプションの指定方法とか変わってくるので、めんどい。
Avatar
あと、>ライブラリのビルドは Swift PM でやるとして SPMの.buildから生成物を手で取ってくるっていうのは不便だと思います
Avatar
うーん、それならやっぱり gysb.json を gysb ファイルと同じ階層においておくだけってのはわかりやすいと思うけどなぁ。
6:24 AM
一括実行は諦めるか、 SwiftPM 対応リポジトリの場合だけ Package.swift と同じ階層も見るとか。
6:25 AM
あとはコマンドラインオプションで指定もできるくらいかなぁ。
Avatar
一括実行を諦めると
6:25 AM
Yamsなどの重い依存を
6:25 AM
何回も取得・ビルドすることになって
6:25 AM
かなり動作が遅くなってしまう
Avatar
えっと、それは swift_config 書く場合と同じで
6:26 AM
gysb.json は各ディレクトリに置くけど
6:26 AM
一度に実行した場合はビルドは一度とかでいいんじゃない?
6:27 AM
指定を gysb ファイルの中に書くか json ファイルの有無でやるかだけの違い。
6:27 AM
gysb Sources/Foo/*.gysb Sources/Bar/*.gysb
Avatar
たとえば src/foo/a.swift.gysb src/foo/b.swift.gysb src/foo/gysb.json src/bar/c.swift.gysb src/bar/d.swift.gysb src/bar/gysb.json こうなってるときに $ gysb src/ こう実行したら
6:28 AM
ああ、これは衝突するから一緒にはできませんよって
6:28 AM
今と同じルールにするということか
Avatar
うん。解決ルールは今と変わらないはず。
Avatar
src/fooとsrc/barをまとめて変換したければsrc/gysb.jsonをおくと
Avatar
設定が同じ場合、 gysb をすべてのディレクトリにコピーしてまわるか、すべてのファイルの先頭の行に書くか程度の違い。
6:29 AM
gysb src/ で再帰的にgysb さがすの??
Avatar
はい それはまだ対応してないけどやるつもり
Avatar
再帰は gysb -r src/ とか明示的にした方が良さそうな気も。
Avatar
ああ、そうですね。
6:30 AM
$ gysb --source-dir src
6:30 AM
こういうイメージ
Avatar
再帰指定のときはその過程の gysb.josn も全部適用で良さそう。 (edited)
Avatar
あ〜
6:31 AM
gysb.jsonごとに実行を分割すればいいのか
6:31 AM
ていうかそれファイル複数のときでも一緒だな
6:32 AM
入力されたファイルごとに対応するgysb.jsonがあって、gysb.jsonごとにグルーピングしてそれぞれ実行すれば良いのか。
Avatar
うーん、それってでも複数 gysb.json で同じライブラリが指定されてた場合、多重ビルドにならない?そこは頑張って回避?
Avatar
複数gysb.jsonをマージしてビルドすることは考えてなかった
Avatar
ん?だって gysb Sources/Foo/*.gysb Sources/Bar/*.gysb みたいなことがしたいんじゃないの?
Avatar
↑の例なら、 Sources/gysb.json が置いてあればうまく動くけど
6:34 AM
Sources/foo/gysb.json と Sources/bar/gysb.json が置いてある場合
6:34 AM
一つのビルドにはできない
6:34 AM
という想定でした
6:35 AM
実際、違うライブラリだけど同じターゲット名、とかが出てくるとマージしようもないし。
Avatar
マージして重複排除でライブラリビルドして、実行はディレクトリ単位にすれば競合があっても解消できそう。
6:35 AM
親と子で競合したらダメだけど。
Avatar
実行はディレクトリ単位っていうのはどういう意味です?
Avatar
ディレクトリの gysb.json を見る方式だと、ディレクトリ単位でしか指定できないから。
Avatar
ディレクトリ単位にした時点で実際のSwiftPMワークスペースがばらばらになるから
6:36 AM
ライブラリが共有できないです
Avatar
swift_config を導入せずに gysb.json を置く方式にするのであれば、一つのディレクトリの中で設定を切り替えることはできないという意味です。
6:37 AM
逆に言うと、同じディレクトリの gysb ファイル同士では設定(ライブラリ)が競合することはない。
Avatar
マージして重複排除でライブラリビルドして、
6:37 AM
このマージするっていうのは
6:38 AM
同じgysb.jsonファイル同士を (edited)
6:38 AM
同じものと検出するってことを言っている?
Avatar
複数の gysb.json の中に書かれた同じバージョンに解決される同じライブラリを重複ビルドしないようにするということを言ってます。
6:39 AM
あー、でもバージョンの解決は Swift PM がやるから無理か。 (edited)
6:39 AM
完全一致くらいなら排除できそうだけど・・・
Avatar
Sources/foo/a.swift.gysb Sources/foo/b.swift.gysb Sources/foo/gysb.json Sources/bar/x.swift.gysb Sources/bar/y.swift.gysb Sources/bar/gysb.json こうなっているときに
6:40 AM
a.swift.gysb と b.swift.gysb を、 一つのPackage.swift でビルド x.swift.gysb と y.swift.gysb を 一つのPackage.swiftにして ビルド (edited)
6:40 AM
っていうふうにすることを考えているけど
6:41 AM
foo/gysb.json と bar/gysb.json をマージして、ライブラリをまとめてビルドするのだとして、
Avatar
Package.json は Package.swift の間違い??
Avatar
その場合、Package.swift は1つで、そこに、a.swift.gysb , b.swift.gysb , x.swift.gysb, y.swift.gysb が所属して、コンパイルするってイメージですか? (edited)
6:43 AM
その考えはわかって、最初そういう意味だと思ったんですけど
実行はディレクトリ単位にすれば競合があっても解消できそう。
その場合この「実行はディレクトリ単位」の概念がわからなかった。
Avatar
そうかー、ビルドを Swift PM に依存してる時点で同一ライブラリであっても Package.swift 間で共有できないのか。 .build 以下をコピーする処理をいれれば共有できるかもだけど。
Avatar
ああ、異なるPackage.swiftがあるけど依存ライブラリのバイナリは再利用することを想定していたんですね
6:44 AM
それはSwiftPMの仕様上うまくできなそうと考えています (edited)
Avatar
そうです < 異なるPackage.swiftがあるけど依存ライブラリのバイナリは再利用することを想定していたんですね
Avatar
SwiftPMは結構細かいことを中でいろいろやっているので
6:45 AM
あんまり途中成果物のバイナリを触って何かするっていう系は
6:45 AM
うまくいかなそうだなあと思ってます
6:46 AM
昨日 @norio_nomura がいろいろ試した結果もそう思った
Avatar
そもそも依存ライブラリの作りによっては、ライブラリのバイナリが生成されない。 (edited)
Avatar
ああ、それもありましたね。
6:46 AM
それが一番ビックリしたんだった。
Avatar
うーん、そしたら、
Avatar
foo/gysb.json と bar/gysb.json でそれぞれ Package.swift 作って2回ビルドでいいと思いますよ。
Avatar
↓ 2 回実行 Sources/Foo/gysb.json Sources/Bar/gysb.json
Avatar
Sources/gysb.json だけにしてけば 1回ビルドにできるのだし。
Avatar
Souces/gysb.jsonSources/Foo/gysb.json をマージ、 Souces/gysb.jsonSources/Bar/gysb.json して 2 回実行 Souces/gysb.json Sources/Foo/gysb.json Sources/Bar/gysb.json
6:49 AM
(差分だけを Foo/gysb.json 等に記述することを想定)
6:50 AM
Foo, Bar 以下のすべての gysb ファイルに対して 1 回で実行 Souces/gysb.json
6:50 AM
とかかなぁ。
6:50 AM
もちろん recursive 指定の場合。
Avatar
そもそもそんなにSources/gysb.json と Sources/Foo/gysb.json で何か分割定義したいと思わないと思うんですよ
6:51 AM
あくまでメタプログラミングのためにつかうライブラリだから
Avatar
そうですね・・・
Avatar
FooではYAMLを読むしBarではXMLを読むからっていって
6:52 AM
別に Sources/gysb.json で YAML と XML 両方のライブラリぶち込んでおいて
6:52 AM
それでFooの管理上困るってことも無いと思う。
6:53 AM
それは要望が出てきてから考えるとして、とりあえずは gysb.json 一個に対して 1 Package.swift で良いと思う
6:54 AM
それはそれとして、 %! swift_conifig はやめてディレクトリ遡り探索の gysb.json にしようと思います
6:55 AM
そのほうが 同じgysb.json 配下の gysbテンプレート達に対して、特定のファイルだけ変換するってことができる。
6:55 AM
swift_config 方式だと全部にその指定を書かないといけないからめんどくさい
Avatar
お、いいですね < %! swift_conifig はやめてディレクトリ遡り探索の gysb.json にしようと思います
6:55 AM
include も廃止?
Avatar
include は必要だと思う。
Avatar
むー
Avatar
ちょっと共通のメタプログラミング用の関数とかは生える事が結構あって
6:56 AM
でもそれをわざわざSPMパッケージにしてリポジトリをわけるのは
6:56 AM
面倒な場合があるだろうから、その場で結合できたほうが良さそう
6:56 AM
あ、でもあれか
6:56 AM
gysb.json で
6:57 AM
結合するファイル達として指定できるようにするという手はあるな。
6:57 AM
同じ理由でincludeを全部に書くのは面倒だから。
Avatar
その方が %! という複雑性を持ち込まなくてよさそう。
Avatar
そうですね
Avatar
どちらかというと include したいのはテンプレートそのものの include だと思うけど
6:58 AM
( HTML 生成するときのヘッダー、フッターとか)
6:58 AM
それも関数化して gysb.json で指定でできるかな?
Avatar
テキストのinclude 、 コード ( % { } の内側 ) のinclude、テンプレートのinclude
6:59 AM
の3種類がありえるとおもったので今は include_code () だけがあるんですが
6:59 AM
テンプレートのincludeにした場合、それ自体は、 %{ } で包まれた中にswiftコードを書いたファイルになるんですが
7:00 AM
それが swift ファイルにならない (構文上) .swift.gysb になってしまう
Avatar
↓とかできるんだっけ? % func foo() { FooFooFoo % } % for _ in 0..<3 { % foo() % }
Avatar
というのが微妙だなあと思っていて
7:00 AM
できますね
Avatar
↓結果 FooFooFoo FooFooFoo FooFooFoo
Avatar
そうなるはず。
7:00 AM
で、swift.gysb になっちゃうと、再帰実行とかで巻き込まれるんですよね・・・
Avatar
よくわかりません・・・
Avatar
gysb.jsonの中に記述できる様にしてしまうとか。
Avatar
jsonの中にswiftを書くのは辛いと思います
Avatar
yamlならいけるかな
Avatar
えっと、 include_code で取り込まれるファイルは
7:03 AM
それ単体でvalidなswiftソースです
Avatar
yaml ならいけるかもしれませんが、 gysb の実行に YAML パーサが必要になって依存が生まれてしまいそう・・・
Avatar
func taxRate() -> Float { return 1.08 }
7:04 AM
とかこういうファイルなわけです。
Avatar
なるほど、何でもテキストを展開するというわけではないのか。
Avatar
でも、 @koher のいうように、 テンプレートをインクルードする機能だとしたら
7:04 AM
%{ func taxRate() -> Float { return 1.08 } }
7:04 AM
こういうファイルを用意することになって・・・
7:05 AM
このファイル名は metalib.swift.gysb とかになる。
7:05 AM
で、さっきの Sources の例でいえば
7:05 AM
Sources/foo/a.swift.gysb // こいつが それを読みに行く Sources/foo/metalib/metalib.swift.gysb
7:05 AM
たとえばこういうファイルツリーにしたくなると思います。
7:06 AM
で、さっきまでの議論を前提に考えて、 $ gysb --source-dir Sources を実行すると・・・
7:06 AM
Sources/foo/metalib/metalib.swift.gysb が 処理対象になって、 自分を自分の上部にincludeしようとして、無限ループして壊れる。
Avatar
そういうことか。
Avatar
これは困ったな、という話です。
7:07 AM
今の仕様であれば、インクルードするのはテンプレートではなくでコードなので、 Sources/foo/metalib/metalib.swift が置かれているけど、これはgysbの実行には関与しないのでうまくうごく。
Avatar
foo/gysb.json に metalib の include を記述とか?
Avatar
再帰探索で metalib.swift.gysb が見つかったときに、これはinclude用だから処理対象からはずそう、 っていう制御をするってことですか?
Avatar
うーん、 gysb から読み込む swift ファイルおくとかは Swift PM で壊れたりしないかな?ディレクトリ分けておけば Package.swift でコントロール可能?
7:09 AM
@omochimetaru はい。 include 用のディレクトリを明記するとか。
Avatar
ターゲットを分けちゃうと public にするとかいろいろ出てきて面倒なんで、シンプルにテキストとして結合されるのが便利な気がします
7:10 AM
いま想定してるのはさっきの func taxRate() みたいな、ちょっとしたやつ。
Avatar
Swiftファイルを読み込むってのは微妙そう。インクルードされるファイルは gysb でも swift でもないべきでは?
7:12 AM
gysb.gysb とか?
Avatar
テンプレートだけどインクルード用としてわかるようにする、っていう手はありますね
7:12 AM
拡張子を gysbi にするとか。
Avatar
ネスト数が必要かと思ったけど、起点を gysb にすればいいだけだから特に問題ないか。
7:13 AM
gysbi が gysbi を include するような場合でも
Avatar
それは大丈夫ですね。
Avatar
でも gysb だとマズイよね。ディレクトリで再帰的に指定されるような場合、インクルード用ファイルも単独で展開されちゃう。
Avatar
gysbi が gysbi を include する
これは、ファイルの中に include 命令が書けるってことになってるとは思うけど・・・
7:14 AM
拡張子が gysb だと面倒なことになりますね
7:14 AM
gysbi が良さそうだなあ。
7:15 AM
template の include なのであれば
Avatar
テキストで include する機能だったら、どのラインに展開するかも重要だから %! 的な構文は避けられなさそう。
Avatar
テキストを注入する効果もあるわけなので
7:15 AM
そうそう。
Avatar
ってか、 gysb 以外なら拡張子なんでもいいのか。
Avatar
まあそうです。
7:15 AM
includeを考えていくと %! から逃げられないですね
7:15 AM
まあgybはそれはできないですけど。
Avatar
%! include("path/to/file") の行をそのファイルの中身で展開するだけ。
Avatar
gybはメタpythonとしてのimportがあるだけだからテキストのincludeはできない
Avatar
Jekyll の include の構文は↓ {% include footer.html %}
7:18 AM
このパスに変数使えたりする {% include {{ page.my_variable }} %}
7:18 AM
ここまで来るとさらにメタになるけどカオスかな?
7:18 AM
んー、でも
7:19 AM
↓とかもあり得る? % for i in 0..<10 { %! include("file\(i).gysbi") % }
Avatar
現状は %! のマクロ言語はテンプレート処理系の前段にあるとしています
7:20 AM
CコンパイラとCプリプロセッサの関係と一緒
7:20 AM
現実的に↑は無理で、なぜなら、
7:20 AM
Swiftとしてのコンパイルをして実行して
7:20 AM
でてきたものを再びテンプレートとして処理するっていうふうに
7:21 AM
Swiftコンパイル実行が何回も繰り返されるモデルになるので
Avatar
include を関数として実装できないかな?
Avatar
実行も遅いし変なことになったときわけがわからなくなりそう。
7:21 AM
テキスト注入する関数としては実装できますが
Avatar
ファイルを読み込んでその内容を write する
Avatar
いまやりたいのはSwiftのメタライブラリを提供するシナリオだから
7:21 AM
includeをコンパイルする時点でコンパイルエラーになって駄目ですね
Avatar
そうだなぁ。
Avatar
include_text: Swift上で実装できる include_template: Swiftコンパイル前に処理しないといけない
Avatar
Swift の関数を読み込むことはできないけど、テンプレートを読み込むことはできるんじゃない? gysbi ファイルに対して gysb を実行して得られた文字列を挿入すれば。
7:25 AM
Jekyll はそっちの挙動だと思う。
Avatar
gysbコマンドを実行して結果を注入するってことですか?
Avatar
はい。
Avatar
それはまあできるけど、Swiftの関数を読み込みたい・・・
Avatar
関数読み込みは gysb.config で記述できそう。
7:26 AM
個別に Swift ファイルのパスを指定するだけで。
Avatar
そうですね。
7:26 AM
機能としては現状の %! include_code を
Avatar
Swift ファイルは gysb じゃないから無限再帰問題もないし。
Avatar
jsonにgysb.jsonに書くようにするってことですね
Avatar
はい。
Avatar
それはありだと思います。
7:27 AM
テンプレートを読み込みたいっていったのは @koher だし・・・
Avatar
テンプレートエンジンとしてはその機能はほしいかと思ったけど、とりあえずなしでいいと思います。複雑化するし。
7:27 AM
そうすれば %! も排除できる。
Avatar
そうですね > %!
7:29 AM
しばらく離席します
Avatar
brewのバイナリ配布、sourceryがSwiftPMでビルドしたものを使ってる。 https://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
7:32 AM
実行環境のSwiftバージョン依存を減らせるから、バイナリ配布はそのうち必要。
Avatar
@mono さんも LicensePlist を brew で配布してたような。 (edited)
Avatar
PR来て途中まで対応しつつ、実はまだ対応できてないです( ´・‿・`)
🙃 1
7:35 AM
Issue: #52 I hope I can install this library with CocoaPods. I tried installing with CocoaPods by referring to SwiftLint etc. I did not actually register with CocoaPods, so I can not confirm whethe...
Avatar
配布手続きはそれほど難しくないです。 (edited)
Avatar
PR や issue で音信不通悲しいですね😂
Avatar
分かれば簡単そうとは思いつつ、初めてだとそれなりに手間取りそうと思って敬遠しちゃっていました 🐶
7:37 AM
その後1回も突っついてないだけなので、何かしらアクションすれば続きできそうですが(あるいは自分で続きやっても良いですが)
7:38 AM
あ、完全に勘違いしていました。
7:38 AM
brewはやってます。
7:39 AM
CocoaPods配布が途中でした 🐶
7:40 AM
でも、brewもバイナリ配布ではなくビルド必要な形式にしちゃっています。 https://qiita.com/mono0926/items/c32c008384df40bf4e41 (edited)
mono0926/LicensePlist という、Carthage・CocoaPodsおよび手動指定ライブラリから、iOS設定アプリに載せられ...
👍 1
Avatar
LicensePlist は CocoaPods でインストールしているライブラリのライセンス情報の生成には対応しているけど、 LicensePlist 自体の CocoaPods でのインストールが未対応ってことですか?
Avatar
そうです。
Avatar
SwiftPM や Carthage と比べると複雑ですよね・・・
Avatar
Homebrewでのバイナリ配布は途中までやりかけたものの少し面倒そうと感じていたところに ishkawaさんからこうリプライいただいて、省略しちゃいました。 https://twitter.com/_ishkawa/status/863662412196597760?ref_src=twsrc%5Etfw&ref_url=https%3A%2F%2Fqiita.com%2Fmono0926%2Fitems%2Fc32c008384df40bf4e41
@_mono それは試したことないですね。自分はbrewで入ればなんでも良いか〜って思ってCarthageの真似で済ませちゃいました。
Avatar
Swift 界隈以外に使ってもらうためのツールならバイナリ配布した方がいいかも?
Avatar
成果物がiOSアプリ用なので、その辺りはあまり問題ないかもです。
Avatar
LicensePlist は大丈夫そうですね。 gysb はバイナリも要りそう。
Avatar
あ、なるほど、そちらはそうですね。
7:47 AM
あと、LicensePlistの場合は、Swift 4対応するとまだXcode 8メインで使っている人がビルドできなくなっちゃうのでそのケアのためにまだ3のままです 🐶
Avatar
ああ、tapにしたのですね。>ビルド必要な形式
Avatar
tapかどうかってビルド必要とは関係なかったような?? bottles対応を省いたからビルド必要、という認識でした。
Avatar
bottles対応ってオプトインだったかな?勝手にビルドされてた様な…
Avatar
bottles do ... end にバイナリの置き場所書けば対応で、省略すればインストール先でビルド必要な認識でした。 (edited)
7:52 AM

はじめに

Homebrewは自作のライブラリを公開することが割と楽な機能を提供してくれている。しかしながら、その作業全体についてちゃんと書いてくれているブログが少ないので、備忘録として自分の作業を晒しておく。なお、自分のgi...
Avatar
gysbはテンプレート言語がswiftで、テンプレートを描画するためにswiftのビルド実行をしているので
7:52 AM
gysb自体がビルドできない環境ではgysbを使うことができないと思います
Avatar
gysbをビルド出来るswiftバージョンと扱うテンプレートに書かれたswiftバージョンが違う場合に、バイナリ配布だと回避できるよね、と。
Avatar
たしかに・・・
Avatar
https://github.com/Homebrew/homebrew-core/ へのformula PRは、CIがビルドに成功したらボトリングしてくれます。まあ、tapでも自前でボトリングすればバイナリ配布は出来るのかな。
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
Avatar
あ、なるほど、前者を知らなかったです。 後者でやろうとして面倒で一旦省略しました。
Avatar
[swift-evolution] update on forum Ted Kremenek via swift-evolution The decision to move to a forum was announced a while ago, and it hasn’t appeared yet. I think we will be making the move soon and I wanted to provide some reasons why it was delayed and what comes next. ... My hope is that process will start in December.
Avatar
@koher gysb.json と include_files 機能できました。マクロ機能を排除できました。アドバイスありがとうございました。
👍 1
Avatar
yaml ならいけるかもしれませんが、 gysb の実行に YAML パーサが必要になって依存が生まれてしまいそう・・・ 一応書いておくと、YamsはCodableをサポートしたYAMLパーサです。Yams自身には外部ライブラリ依存はなくて、利用実績としてはSwiftLintが.swiftlint.ymlのパースに使っています。
Avatar
gysb.jsonではなくgysb.ymlも書けたほうが良いですかね? 手書き想定ファイルだしそうかな
Avatar
@norio_nomura gysb から Yams 等への依存が生まれるという意図でした。依存自体は悪くないんですが、なくせるならなくした方が望ましいとは思うので。
👍 1
Avatar
CIができたから次はHomebrewじゃい、と思ったが、monoさんの記事読んで、なんかめんどくさそうだな・・・って気分
🐶 1
Avatar
改めてmonoさんの記事を読んだけど、tap作る手順は面倒いね。homebrew-coreへPR出す方が簡単なのでは…
👀 1
Avatar
それぞれの長所短所あまり把握し切らず、何となく最近のはtapが多いかな??と思いつつそっちにしました。 (edited)
12:09 PM
Vaporとかもtapですね( ´・‿・`)
Avatar
とりあえずtapならオレオレで勝手にできるから楽そう
Avatar
@_mono 初回は苦戦した記憶がありますが、1度やれば簡単だった気がします。参考になるかわかりませんが、当時のメモを貼っておきますね。 https://t.co/OBZtRlwl1S
12:15 PM
そういえば、あまり深く考えずにこれをベースにした、というのがtapにした大きな理由でした( ´・‿・`)
Avatar
なるほど
Avatar
やべえ・・・
12:16 PM
ちょっと変えるだけでタグのプッシュとtarのDLとハッシュの計算が必要や・・・
Avatar
LicensePlist - A license list generator of all your dependencies for iOS applications
12:18 PM
そのあたり苦手ですが、がんばって書きました🐶
Avatar
https://github.com/Homebrew/homebrew-core/fork を開いてforkして、remote登録: $(brew --repository homebrew/core) git remote add omochi https://github.com/omochi/homebrew-core.git したら、次のコマンドでformula作成: brew create https://github.com/omochi/gysb/archive/0.8.6.tar.gz して、出来たgysb.rbdepends_on, def install, test dohttps://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb 辺りを参考に設定して、 brew install --verbose --debug gysb でインストールテストして、 cd $(brew --repo homebrew/core) git checkout -b gysb git add Formula/gysb.rb git commit git push https://github.com/omochi/homebrew-core/ gysb してPR、って感じかな?
GitHub is where people build software. More than 25 million people use GitHub to discover, fork, and contribute to over 71 million projects.
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
👀 1
12:18 PM
Makefileとか不要。
12:19 PM
class Gysb < Formula desc "Generate your swifty boilerplate" homepage "" url "https://github.com/omochi/gysb/archive/0.8.6.tar.gz" sha256 "139fd7225442c74e943b32716158a3ea5bd438241372a3cf913fd5313793248e" depends_on :xcode => ["9.0", :build] def install system "swift", "build", "--disable-sandbox", "-c", "release", "-Xswiftc", "-static-stdlib" bin.install ".build/x86_64-apple-macosx10.10/release/gysb" end test do # `test do` will create, run in and delete a temporary directory. # # This test will fail and we won't accept that! For Homebrew/homebrew-core # this will need to be a test that verifies the functionality of the # software. Run the test with `brew test gysb`. Options passed # to `brew install` such as `--HEAD` also need to be provided to `brew test`. # # The installed folder is not in the path, so use the entire path to any # executables being tested: `system "#{bin}/program", "do", "something"`. system "true" end end
Avatar
bin.install はなんですか?
Avatar
https://docs.brew.sh/Formula-Cookbook.html を見ると大体わかる。
🍺 The missing package manager for macOS
👀 2
12:23 PM
PR開くとチェックリストがテンプレートに載ってるので、追加でそれらに載ってるテストが必要。
Avatar
ユーザー増えてきたら本家入り考えることにします
Avatar
一度掲載されたら、次回バージョンアップからはコマンドライン1発でPR開くところまでいけたはず。 https://github.com/realm/SwiftLint/blob/master/Makefile#L114
SwiftLint - A tool to enforce Swift style and conventions.
Avatar
なるほど。それは楽だ。。
12:35 PM
上で書いたFormulaはtest dosystem "true"とか書いたけど、そこは真面目に書き換えないといけない。
12:36 PM
テストはsandbox環境下で行われるので、sandboxで動かない機能をテストしたりすると失敗する。
12:38 PM
sourceryの場合は期待したバージョンをsourcery --versionで返すかどうか、かな。
Avatar
ふむふむ
Avatar
あ、sourceryはsandboxのせいで、本来のテストが出来てないみたいだな。 本来のテストは真面目にコード生成してる。 https://github.com/Homebrew/homebrew-core/blob/master/Formula/sourcery.rb#L32-L54
homebrew-core - 🍻 Default formulae for the missing package manager for macOS
12:47 PM
gysbのテスト記述はこれを参考に出来そう。
Avatar
なるほど brew と ruby の道具で書いてありますね
Avatar
この辺りが自前tapリポジトリを使ったとしても通用するのかどうかは知らないです。
12:52 PM
homebrew-coreもtapなので、いけそうな気もしますが。
Avatar
そういえばSSSやってる人はみんなVaporとかKituraとかPerfectとかどれでやってますか?
Avatar
#server-side チャンネルがいいかも
Avatar
あったそんなチャンネル!
Avatar
swift - The Swift Programming Language
Avatar
朝見たけどまだ何もなさそうだった
Avatar
何が起こるんだろう・・・
Avatar
Android対応とかですかねえ
Avatar
うーん、 Android は Kotlin 採用したし、 Swift だと JVM で動かないし、違いそうな気がするなぁ。 Chris Lattner がらみかな?
Avatar
GoogleのSwift fork、本家に Fuchsia OS 対応のプルリク投げてる https://t.co/jPsh9Kvi0h
Avatar
Fuchsia is a capability-based, real-time operating system (RTOS) currently being developed by Google. It was first discovered as a mysterious code post on GitHub in August 2016, without any official announcement. In contrast to prior Google-devel...
Avatar
https://bugs.swift.org/browse/SR-6103 この前投稿した LoE のバグが解決された よかった
Avatar
ズル
Avatar
tarunonのバグは・・・
Avatar
なんだと
3:44 AM
返事がほしいでござる
Avatar
@omochimetaru Assignee 担ってるけど、何かアクションを求められてるの?
Avatar
あれ、ほんとうだ
Avatar
勝手に直せやだったらウケる
Avatar
いま resolved だけど、 closed に俺がするんか?
3:45 AM
コメント欄で聞いてみる
Avatar
僕の唯一のResolvedは担当者無しやで
3:48 AM
適当なんちゃう?
3:48 AM
そもそもそれも明らかに治ってるのに音沙汰なかったからこれ治ってるよね?って聞いたら解決済みになったやつ
Avatar
6126は CC joe groff ついたけど 6304については完全に無だね
Avatar
感情が消えた
Avatar
投票しておいた
Avatar
6126はそもそも変性のルールがほこ×たてしてるからなぁ
3:50 AM
ほこたてで変換したら変なのでた
Avatar
動作確認はしたの?>Assignee
Avatar
いや、まだです
3:53 AM
Tracking internally as rdar://35215926. ↑こうなっちゃった時点で
3:53 AM
それについて再現テストがたされたのかとか
3:53 AM
よくわからんのですよね
3:54 AM
僕が確認することより再発防止のためにテスト追加することが一番大事だと思うんですけど・・・
Avatar
PRではテストが追加されてるみたいだけど。
Avatar
ですね。ちょうど今見てました。
3:57 AM
+struct ParameterizedStruct<T> { + mutating func takesFunctionWithGenericReturnType(_ f: (Int) -> T) {} +} これがArrayに相当してるのか
Avatar
とりあえず、issueに載せたコードを動かしてみるといいのでは?w
Avatar
そうですね、マージされてるし、あとでsnapshot落としてきて試してみます。
Avatar
あ、まだこのPRを含むsnapshotは無いみたい。
Avatar
あれ、でもmaster に merged だから
4:07 AM
a
4:07 AM
November 15, 2017
Avatar
git tag --contains cf9a09e18dba7a7fe0506381589fbf0f4bb99a98 で何も出ない。
Avatar
mergeされたのが17日か
4:08 AM
dailyが15日以降まだ来てないんですね。CIがコケてるのかしら。
Avatar
swift-DEVELOPMENT-SNAPSHOT-2017-11-21-a出てる。
Avatar
DL中
Avatar
#beginner-help_archived が別の話題が進んでるんで、こちらで質問させてください。Swift で C++ の const 引数みたいなことって method / closure でできるんですっけ?
Avatar
method / closureでできるの意味がいまいちわからないですが
Avatar
inoutじゃない値型は全部copyなので実用上constになる気がします
Avatar
すいませんわかりづらい書き方でした。引数で渡す class をその method 内で変更しないことを示せるのかな?と思って。
Avatar
classはあきらめて
Avatar
ですが、そもそも class に non mutating な method が定義できないので、const 性を保証できないのでそれはおかしいというツッコミを受けました(報告)
Avatar
残当
🙏 1
😭 1
Avatar
struct にすれば > inoutじゃない値型は全部copyなので実用上constになる気がします < このとおり
8:12 AM
あとは class なら親クラスを readonly な type にして サブクラスで mutating なメソッドを一通り実装すれば・・・
8:12 AM
引数で渡す class をその method 内で変更しないことを示せる
これじたいはできるよ。
Avatar
readonlyをprotocolで表現してprotocol型で渡した方が良いですね
8:13 AM
流石にclassは面倒すぎるしlet propertyをvarでoverrideできな…できるの?!
8:14 AM
iPhoneなので試せない
Avatar
たしかにprotocol横付けが楽ですね、ジェネリックだったら 😇
Avatar
今回はジェネリックじゃないので protocol 案でいけそう
8:19 AM
🙏
Avatar
ジェネリックでもassoctypeつけて関数をジェネリックにすれば動くから出来るまで頑張ろう
Avatar
ああこの状況なら <X: Proto> でいいのか
Avatar
そう
Avatar
なるほどなるほど
Avatar
たしかに別にプロパティに保管するわけじゃないからいけるのか
Avatar
プロパティに保管するならその時にerasureを使うぞ
Avatar
無駄Optional警察だ!👮
Avatar
www
8:47 AM
そこかいw
Avatar
代入テストで雑にそうしました… 🙏
Avatar
あとこれclassはそのままclassなんで意味なくないですか
Avatar
processPoに渡すクロージャの中ではsetterが呼び出せないから意味あると思うよ (edited)
Avatar
あ、これはPoについてConstにしたいのか
8:49 AM
Elementについてと勘違いしてた
Avatar
そうです。Po を Const にしたかった
Avatar
型パラが妙に多いな
8:50 AM
func processPo<X: ConstPo>(po: X, process: (X.Element) -> Void) { これでok
Avatar
なるほど!
Avatar
本当はElementとかも含めて再帰的にConst化したいと思うんですが、今日のswiftではそれをシュッとやるのは無理ですね
8:54 AM
structつかおう (edited)
Avatar
たしかに再帰は…
8:55 AM
うーんなるほど
9:00 AM
あ、でも今回は露出するプロパティが値型なので完全に目的を達成できそう
9:01 AM
ありがとうございました
Avatar
これって const の場合と違って、型ごと CostoPo を満たさないといけないの微妙そう。
Avatar
そこなんすよね
Avatar
struct じゃダメ? Swift の class は二級市民だと思ってる。
Avatar
そうですね
Avatar
抽象クラスとかもないし。
Avatar
View なのでうーん…
Avatar
再起でできるためにはConstableみたいな不毛なprotocolが必要になって、class to type-erasure structな記述をやる羽目になる
Avatar
View に対応した ViewModel を struct で作って渡すとか?
Avatar
structだとvar/letですむのに
Avatar
View 自体を操作する関数だとダメだけど。
9:04 AM
(でも const にしたいくらいだから View から情報をとりたいだけに見える)
Avatar
そうですね
Avatar
caseでenumから値とるやつ、ここまとめられるの知らなかった。 enum Hoge { case fuga(Int) case piyo(Int) var count: Int { switch self { case .fuga(let count), .piyo(let count): // <- ここ return count } } }
Avatar
えっ、どうなってんの、それ
Avatar
protocolはまとめられないよん
Avatar
同じ let count だからいける?
Avatar
同じ具体型なら変数そろえて同一視できる
Avatar
ワオー知らなかった
Avatar
tarunonのいうとおりこれはエラーなった protocol ProtocolA {} enum Hoge { case fuga(ProtocolA) case piyo(ProtocolA) var count: ProtocolA { switch self { case .fuga(let count), .piyo(let count): return count } } }
9:25 AM
Playground execution failed: error: MyPlayground.playground:5:24: error: matching a protocol value in multiple patterns is not yet supported; use separate cases instead case .fuga(let count), .piyo(let count): ^
Avatar
前はコンパイラが破壊された
9:25 AM
僕の報告一覧にあるよ
9:25 AM
一応コンパイルエラーになったから解決なのかな
Avatar
おもしろ記法みつけたと思ったら過去にtarunonに破壊も報告も修正もされてるのなんか悔しい
9:26 AM
悔しい💢
Avatar
そんなおこらんといてや
Avatar
Swift おもしろ記法 探検隊
Avatar
@tarunon これなら通りそうなもんだけど、これもだめなんか protocol ProtocolA {} enum Hoge<T: ProtocolA> { case fuga(T) case piyo(T) var count: T { switch self { case .fuga(let count), .piyo(let count): return count } } }
Avatar
パターンマッチ関連のおもしろ記法と言えば前に教えてもらった↓かなぁ。 let a: Int? = 42 if case let a? = a { print(a) }
9:28 AM
Optional Binding よりも意味がわかりやすい。
Avatar
でた 左辺ハテナw
Avatar
あれそれIterator.next()が粉砕されるやつでは
Avatar
これって C で int *a = ...; *a = 42; って書くのと似てるよね。 (edited)
Avatar
@hiragram そのTが通らないのは謎やね
Avatar
だよね。
Avatar
見た目だけは似てますね・・・ > *a = 42
Avatar
いや、 *aint 型というのと、 a?Int 型というのが。
Avatar
a? は Int 型ではないですよね
Avatar
あ、これはInt型だから虐殺文法ではなかった
Avatar
代入文の左辺に書けるだけで a? は Optional<Int> だからこそ a の部分だけが Int
9:33 AM
この言い方だとCもそうだけど・・・
9:33 AM
Cは中身と外見が先にあってデリファレンスするけど、 Swiftのさっきの式は中身がそこで産まれるから逆な感じがする。
Avatar
逆か。 a?Int?aInt か。
9:35 AM
C は *aintaint *
Avatar
さっきのTが通らないの、Tにprotocol入れられたら壊れるからと思ったけど、今はconditionalな型パラはそもそもprotocol入らないので益々謎だ
9:37 AM
その条件付けサボってるのかな
9:39 AM
それか将来的にprotocolが来る可能性があって意図してそうやってるか
Avatar
抜けてるだけじゃねって印象
9:43 AM
@tarunon プロパティじゃなくてメソッドにしたらエラーメッセージがなんか愉快なことになったよ protocol ProtocolA {} enum Hoge<T: ProtocolA> { case fuga(T) case piyo(T) func value<T>() -> T { switch self { case .fuga(let value), .piyo(let value): return value } } } error: MyPlayground.playground:6:20: error: cannot convert return expression of type 'T' to return type 'T' return value ^~~~~ as! T
Avatar
9:44 AM
報告しよう
Avatar
as! Tいれると其の行はエラー消えるけどcase文の行がまたさっきのエラーでるんだけどね
9:44 AM
つまりvalueはTとして認識できてるんだからそのままコンパイル通ってもいいようなきがするんだけどそういうわけではない?
Avatar
不思議なエラーだ
Avatar
意図的に止めてそう
9:45 AM
protocol型で其れが出来ないのは、実際にはprotocol型そのものではなく存在型として振る舞ってることが関係してそうで
9:46 AM
型パラは常にprotocolが当てられることを想定した振る舞いになってる
9:46 AM
TとTが違うよは意味分からんけどprotocolのそれを踏まえて考えると然もありなん
Avatar
文脈的に1個目のTと2個目のTが違う型の可能性ある可能性あるからってことよね
Avatar
だね
9:49 AM
ただまあエラーメッセージは適切ではないから報告はしといてよさそう、回答も貰えるといいね
Avatar
どっから報告するんだっけ。
Avatar
bugs.swift.org
Avatar
あとで暇みつけて書いておく
9:50 AM
こっちの書き方はちゃんとやってくれてうれしい typealias Tuple = (Int, String) enum Hoge { case fuga(Int) case piyo(Tuple) var value: Int { switch self { case .fuga(let value), .piyo((let value, _)): return value } } }
9:54 AM
piyoにくっついてくる値がIntのプロパティをもつようなstructで、caseまとめて書く記法のなかでそのstructのIntのプロパティ取り出せたら便利かと思ったけどそこまでごちゃごちゃしてるならcase分けるわな
Avatar
struct のプロパティとかをパターンで抽出するの、昔 swift のソースに無効化された状態であったけど、やらない雰囲気だからって消された覚えがあります。
Avatar
おおっ
Avatar
別件で Array の要素とマッチさせるのは evolution に何度か上がってた記憶ありますね。
9:59 AM
case let [first, second, third]: みたいな。
Avatar
おー。
10:02 AM
この場合要素数が2だったらこのcaseにマッチしなくなるのか (edited)
Avatar
そんなのがあったのか〜
Avatar
error: MyPlayground.playground:6:20: error: cannot convert return expression of type 'T' to return type 'T' return value ^~~~~ as! T これは真っ当なエラーでは…
Avatar
というか、タイプの T使うなら func はこの場合Genericsにすべきでないですね。
Avatar
見逃してた
11:14 AM
<T>ついてるw
Avatar
あ、ほんとだ。
Avatar
あっ
11:14 AM
ごめんなさい 🙏
11:15 AM
↑それさっきやらかした
Avatar
タイプの型パラshadowしたら警告出すとか有用なのかも。
Avatar
↑の例は Event と T だからshadowでもないんですよね・・・w
😇 1
11:17 AM
Array.Elementも結構引数で受けるときはT, U で書いちゃうし
11:18 AM
逆にそのような警告を出す機能があったら、ちゃんとした名前をいつでも使うように心がけるようにはなりそうだ。
Avatar
この余分なTあるとnever使えなくなって訳わからなくなるよね
Avatar
推論がコケるんだよねw
11:21 AM
すぐ気づけて良かった・・・
Avatar
ハマると、一度ハマった経験がないと気づけなくなる
Avatar
https://bugs.swift.org/browse/SR-1420 既に上がっていました。<型パラshadow警告
Avatar
要望っぽいものも上がってるんですね
Avatar
sublime text の syntax カラーリング わかってきた
3:59 PM
しかし既存の Swift プラグインは残念ながら tmLanguage 形式で
4:02 PM
これとがんばって連携していくか、 sublime-syntax 形式での対応を1からやるか・・・
Avatar
ほうほう、tmLanguage って TextMate のシンタックス定義なんですね。
Avatar
そのようです。SublimeText2まではそっちだったけど、SublimeText3から、tmLanguageも使えるけど、独自のsublime-syntaxを使おうねって感じ
4:04 PM
スタック付きの正規表現ベースのオートマトンみたいな仕組みっぽい
Avatar
Swiftのパーサ周りを読んでいたら、 TokentokTok が出てきて、
3:10 AM
Tok の定義が全然見つからないと思ったら Token 型のフィールド名が Tok だった・・・
3:12 AM
ちなみに tok は enum
Avatar
フィールド名を UpperCamelCase にするのは LLVM 文化特有なんですかねー。
Avatar
Googleは snake_case_ ですね、他のC++プロダクトをそんなに読んでないのでわからないですが
Avatar
やっぱりxcodeでリーディングしようと思ってclone,update,build-script --xcodeしてxcodeで開いて、
1:18 PM
プロジェクトのソースツリーのカオスさに笑ってる
Avatar
ソースツリー役に立たないから検索ばっかしてる
Avatar
Swift がオープンソースになってしばらく経ちます。 コンパイラや標準ライブラリの開発に手を出してみたいけど、リポジトリを落とした後どうしていいかわからない!という方のために、まずは開発環境の構築方法をご紹介します。基本的には[RE...
1:19 PM
この記事のスクショとすこし違ってる(Sourcesが無い)
1:21 PM
ひらりがこの前言ってた、ファイル名あいまいジャンプできるやつ
1:21 PM
役に立ちそう
Avatar
⌘⇧Oと⌘⇧Fめっちゃ使うけど結構迷子になるからソースツリー+差分と履歴も使う
1:24 PM
ソースツリーの下の検索ボックスの横に時計とgitマークあるので、onにすると最近見たファイルとか差分のあるファイルで絞り込めてソースツリーが使い物になるようになる
Avatar
なるほど
1:26 PM
あ、あった、ここらへんだ
1:26 PM
swift/lib/XXX のディレクトリごとに対応するターゲットがあった
Avatar
え、、、
1:27 PM
俺は一体今まで何を、、、、
Avatar
上から60%ぐらいのところに
1:28 PM
swiftIndex , swiftIDE, swiftIRGen, swiftParse
1:28 PM
などのグループがあって、それぞれの中に、SourceFilesとHeaderFilesが入ってて
1:29 PM
1:29 PM
ここらへんの lib/ XXX / CMakeList と対応してるっぽいね
Avatar
なんか、グループの作られ具合、CMakeのバージョンによっても違うのかも。
Avatar
CMakeList一個が一個のターゲットになってて、Xcodeに噛み合わないやつは、そのままCmakeをたたくだけのスクリプトターゲットになってて、 オプション違い?もバラバラに生成されるから、こんなカオスなのだな
1:31 PM
xcodeprojの生成自体は完全にcmake側の機能に任せてるんですかね?
Avatar
そのはずですね。 CMake -G Xcode
Avatar
なるなる
1:34 PM
おっしゃー
1:34 PM
Tok でジャンプできたぞw
1:34 PM
1日消えたw(途中で寝落ちしてた (edited)
Avatar
--release-debuginfo --xcode でビルドしたら
4:43 PM
clang: error: no such file or directory: '/Users/omochi/work/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/Debug/libcmark.a' と出ていて (edited)
4:43 PM
実際には /Users/omochi/work/swift-source/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/src/RelWithDebInfo/libcmark.a
4:43 PM
が生成されているので
4:44 PM
--release-debuginfo なのに cmark は --debug で参照しちゃっててうまくいってないみたいなんですけど
4:46 PM
--xcode は作業用、 ninja でビルド するのが良いのか? release-debuginfo があまりメンテナンスされていないので、 release にするのが良いのか? とか、どうなんでしょう
Avatar
あら、 Releaseでやっても同じところでコケた
Avatar
あっ!
7:17 PM
なるほど、build-scriptに渡したconfigurationとは別に、xcode側のいつものconfigurationをちゃんと設定しないといかんのか。
Avatar
omochimetaru