日本語 · English

Kairos 言語仕様 — 5. 文法と記号

5.1 記号一覧

記号 層/役 意味
\|> 両層 段の連結(本体層: stream → stream / premise 層: premise → premise)
. 両層 premise 修飾(Gregorian.month
\| 両層 結合子・和
& 両層 結合子・積
\ 両層 結合子・差(U+005C。円記号 ¥ ではない)
= 両層 束縛(定義)
== != < <= > >= 値式 比較
+ - * / mod div 値式 算術(mod=剰余・div=整数除算は語)
and or not 値式 論理(語。記号は結合子に温存)
? : 値式 三項条件
in 値式 リスト所属述語
[…] / l[i] 値式 リストリテラル/添字(0 起点)。時点要素のリストは時間ストリーム定数(§3.8)
"…" 値式 文字列リテラル(改行不可・エスケープなし。TZ・出所の値。ADR-32)
.. 値式 日付範囲(連続日への展開糖衣)
=> 両層 ラムダ束縛(型記法 -> と区別)
@名前 前文 premise 束の軽量参照
# 両層 行コメント

5.2 本体層 core 族のシグネチャ

5.3 premise 層のシグネチャ

原始的定義の窓生成語(名は確定。§5.4):

派生的定義:

糖衣定義(専用構文なし=既存の = 束縛):

5.4 命名の確定状況

確定(2026-07-07・RC2 時点+ADR-31/32): 窓生成語 gridspansplitcycle、引数 anchor:phase:by:from:(stride 一族で必須)、メンバー epoch:(紀元)、文字列リテラル "…"、 派生の with(以上 RC1・40-examples の表現力検証で綻びなし)。基底の字句名 chronosday = chronos grid 1d。型名も Chronos)と操作軸の axis:——両者の二義は ADR-29 で解消し、双方を正式名に確定。射影一族の ordinalInepochOrdinalsnapTo と付与・データ側の label:labels:covering:——内部設計の 確定(ADR-30)と綻び出し(40-examples/04-projections.md・F34〜F42)で名への綻びが出なかったため RC2 で確定。 本体層の記号・演算子名(|>withinsegmentByrollshiftstridestrideByfilter・選択子・ 結合子)も確定。日付・幅リテラルの字句は ADR-28 で確定(§5.5)。

確定(2026-07-14・ADR-46=設計者裁定): 外部供給宣言 external(比較候補 socket は 英語版文書の ADR-15 の比喩 “socket” と同綴り別義になるため不採用)と kind 値 dates/instantseveryInstant・date-literal と語感整合・既存識別子との衝突なしを掃引確認)。

確定(2026-07-09・F51 の一括確定=設計者裁定): nonWorking(実体の予約公開語・§3.9)・ coincides(窓所属述語・§4.9。比較候補 hits/anyIn/sharesWindow は不採用)・rebase(再錨・ §4.4。比較候補 relabel/sameDate は不採用)・bizOpen/bizClose/isOpen(標準導出・§3.9.1)は そのまま正式名に確定。営業時間の供給の対は sessionOpens/sessionCloses に改名して確定 (旧仮称 opens/closes——一般英単語で偶然の同名束縛との衝突面が広いため。ADR-41 改訂)。 いずれも実戦使用(16〜35 ファイル)で名への綻びなし。

確定(2026-07-26・設計者裁定=最後の仮称の解消): 窓境界の位相ずらし糖衣は rephase (旧仮称 shiftBoundary)。展開の実体(spanphase: 差し替え)と名が一致し、rebase(再錨)・ anchor:(位相を留める実日)と語彙系で対称。比較候補 shiftBoundary 昇格(点変換 shift と別物 なのに同語幹・13 字)・shiftPhase(同語幹の紛れが残る)・offsetBoundary/moveBoundary(新語幹) は不採用。boundary の語は k 可変組を扱う将来の別演算子(§3.7・スコープ外)に温存する。 これで全語彙が正式名——仮称は残っていない(経緯は CHANGELOG 追補 11)。

5.5 字句(ADR-28)

5.6 文法(EBNF)

構造・語彙とも確定(§5.4——仮称は残っていない)。糖衣(a..b 範囲、ポイントフリー略記)は 展開で core に消える。

(* ---- プログラム ---- *)
program        = { statement } ;
statement      = premise-def | preamble | binding | stream-expr ;

(* ---- premise 層 ---- *)
premise-def    = "premise" , name , ( premise-block | "=" , premise-expr ) ;
premise-expr   = name , [ "with" , premise-block ] , { "|>" , stage } ;
premise-block  = "{" , { member | binding } , "}" ;
member         = member-key , ":" , value-expr ;
member-key     = "calendar-system" | "calendar" | "axis" | "roll" | "granularity"
               | "tz" | "wkst" | "asof" | "source" | "epoch" ;
                 (* epoch は原始的定義ブロック専用(利用側前文には置けない。ADR-31) *)

(* 前文(独立の文。以降の文を次の前文まで統べる。§3.2) *)
preamble       = ( "@" , name , { member } )            (* 軽量形+後置畳み込み *)
               | ( "premise" , premise-block )          (* 完全形インライン *)
               | ( "@" , name , "{" , { statement } , "}" ) ;   (* ブロック形(範囲の明示) *)

(* ---- 束縛(公開語・糖衣・値関数が同じ機構) ---- *)
binding        = name , [ "(" , params , ")" ] , "=" , rhs ,
                 [ "covering" , ":" , covering-list ] ;  (* 束縛後置=合成の明示被覆主張(ADR-37 判断 5)。
                                                            rhs がテーブルリテラル単体のときはテーブル属性
                                                            として読む(正規の構文解釈。ADR-45) *)
params         = param , { "," , param } ;
param          = name | named-param ;
named-param    = param-key , ":" , name ;
rhs            = lambda | stream-expr | gen-expr | value-expr ;

(* ---- 本体層 ---- *)
stream-expr    = pipe-expr , { combine-op , pipe-expr } ;     (* 同一優先度・左結合 *)
combine-op     = "|" | "&" | "\" ;
pipe-expr      = stream-atom , { "|>" , stage } ;
stream-atom    = table-literal | ( name | qualified ) , [ "(" , args , ")" ] | "(" , stream-expr , ")" ;
                 (* qualified 適用=修飾ピンの頭位置適用(Gregorian.year(2020)。ADR-42) *)
stage          = ( name | qualified ) , [ "(" , args , ")" ] ;
qualified      = name , "." , name ;
args           = arg , { "," , arg } ;
arg            = named-arg | lambda | stream-expr | value-expr ;
named-arg      = param-key , ":" , ( lambda | stream-expr | value-expr | cycle-labels ) ;
                                       (* cycle-labels は segmentBy の labels: の値位置のみ(ADR-47) *)
cycle-labels   = "cycle" , ( list-literal | name ) , "anchor" , ":" , date-literal ;
param-key      = "on" | "unit" | "of" | "from" | "edges" | "empties"
               | "by" | "anchor" | "phase" | "covering" | "label" | "labels"
               | "kind" | "source" ;                     (* kind:/source: は external(ADR-46) *)

(* ---- premise 層の窓生成(中置) ---- *)
gen-expr       = operand , gen-word , gen-arg , { named-arg } ;
operand        = name ;                                  (* chronos・day・month・year 等 *)
gen-word       = "grid" | "span" | "split" | "cycle" ;
gen-arg        = width-literal | lambda | list-literal | name | "(" , lambda , ")" ;

(* ---- 値式 ---- *)
value-expr     = ternary ;
ternary        = or-expr , [ "?" , value-expr , ":" , value-expr ] ;
or-expr        = and-expr , { "or" , and-expr } ;
and-expr       = unary-not , { "and" , unary-not } ;
unary-not      = [ "not" ] , comparison ;                (* not(x) の関数形も可 *)
comparison     = additive , [ comp-op , additive ] ;
comp-op        = "==" | "!=" | "<" | "<=" | ">" | ">=" | "in" ;
additive       = multiplicative , { ( "+" | "-" ) , multiplicative } ;
multiplicative = unary , { ( "*" | "/" | "mod" | "div" ) , unary } ;
unary          = [ "-" ] , postfix ;
postfix        = atom , { "[" , value-expr , "]" | "(" , args , ")" } ;
atom           = number | date-literal | width-literal | string-literal | name | qualified
               | list-literal | "(" , value-expr , ")" ;
lambda         = ( name | "_" | "(" , params , ")" ) , "=>" , ( value-expr | stream-expr ) ;

(* ---- リスト・テーブル ---- *)
list-literal   = "[" , [ list-elem , { "," , list-elem } ] , "]" ;
list-elem      = value-expr | date-range ;
date-range     = date-literal , ".." , date-literal ;    (* 連続日へ展開される糖衣 *)
table-literal  = list-literal , { "covering" , ":" , covering-list
                                | "labels" , ":" , list-literal } ; (* 後置は順序自由・各一回(二重指定は
                                                            静的エラー。RC5 追補 9)。要素が時点なら
                                                            ストリーム定数(§3.8)。要素ゼロは covering:
                                                            後置に限りストリーム定数(空テーブル・ADR-45)。
                                                            labels: は並行ラベル列(ADR-30) *)
covering-list  = covering-range , { "," , covering-range } ;   (* 区間リスト=中抜けの申告(ADR-37) *)
covering-range = [ covering-edge ] , ".." , [ covering-edge ] ; (* 端の省略=開端(完結主張)。
                                                                   ".." 単独=全域完結。ADR-37 判断 9 *)
covering-edge  = date-literal | digit4 ;                 (* 年だけの略記可 *)

(* ---- 字句(§5.5) ---- *)
date-literal   = digit4 , "-" , digit2 , "-" , digit2 ,
                 [ "T" , digit2 , ":" , digit2 , [ ":" , digit2 , [ "." , digits ] ] ] ;
width-literal  = civil-width | elapsed-width ;
civil-width    = digits , "d" ;
elapsed-width  = [ digits , "h" ] , [ digits , "m" ] , [ digits , [ "." , digits ] , "s" ] ;
number         = digits , [ "." , digits ] ;
string-literal = '"' , { ? " と改行以外の任意文字 ? } , '"' ;   (* エスケープなし。ADR-32 *)
name           = letter , { letter | digit } ;           (* letter は Unicode 文字(漢字可) *)
comment        = "#" , { ? 行末までの任意文字 ? } ;

注記: 列挙ラベル(MonFollowing)は字句上 name と同じで、意味論(在圏 premise の解決)で区別する。 table-literallist-literal は同一構文で、型が要素で決まる(ADR-26。要素ゼロは covering: の有無で 決まる——covering つき=空テーブル・なし=空の値リスト。ADR-45)。labels: のラベル列は時点列と同長 (意味論検査。ADR-30。空テーブルは labels: [] のみ合法)。演算子の優先順位は上の生成規則の入れ子がそのまま定義(結合子は同一優先度・左結合、 & 混在は括弧必須の規約を検査で課す。§4.5)。前文(preamble)は文法上独立の文で、束縛・本体式はその下に並べて よい(§7.5 の祝日カスケードが例)。効力は次の前文まで(§3.2)——これは文法でなくスコープ規則。危険メンバーが 未解決のまま評価に至る本体式は静的エラー(§3.3——同じく文法でなく統治の検査)。

5.7 未確定事項

未確定事項・宿題の正本は ../design/90-open-questions.md(構文レベルの詳細は ../design/30-syntax/00-syntax-draft.md §4)。 本仕様の範囲では、k 可変組の射程外を扱う別演算子(必要になれば導入・boundary の語を温存)・ of: の匿名窓ラベル付けが未確定として残る(命名は全語確定rephase の裁定〈2026-07-26・ §5.4〉で仮称ゼロ・外部供給宣言は external として確定=ADR-46・§3.8)。いずれも意味論を変えない (追加拡張。DoD の分類は ../design/90-open-questions.md 冒頭)。