expr.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. package program
  2. import (
  3. "regexp"
  4. "math/big"
  5. "kumachan/standalone/ctn"
  6. "kumachan/interpreter/core"
  7. "kumachan/lang/source"
  8. "kumachan/lang/typsys"
  9. )
  10. type ExprBasedFunctionValue struct {
  11. InputArgs [] *Binding
  12. InputCtx [] *Binding
  13. Output *Expr
  14. }
  15. func (v *ExprBasedFunctionValue) Call(args ([] core.Object), ctx ([] core.Object), h core.RuntimeHandle) core.Object {
  16. var eval_ctx = CreateEvalContext(h)
  17. eval_ctx = eval_ctx.NewCtxBindAll(v.InputArgs, args)
  18. eval_ctx = eval_ctx.NewCtxBindAll(v.InputCtx, ctx)
  19. return eval_ctx.Eval(v.Output)
  20. }
  21. type Expr struct {
  22. Type typsys.CertainType
  23. Info ExprInfo
  24. Content ExprContent
  25. }
  26. type ExprInfo struct {
  27. Location source.Location
  28. }
  29. func ExprInfoFrom(loc source.Location) ExprInfo {
  30. return ExprInfo { Location: loc }
  31. }
  32. type ExprContent interface {
  33. Eval(ctx *EvalContext) core.Object
  34. }
  35. type EvalContext struct {
  36. bindingValues ctn.Map[uintptr, core.Object]
  37. runtimeHandle core.RuntimeHandle
  38. }
  39. func CreateEvalContext(h core.RuntimeHandle) *EvalContext {
  40. return &EvalContext {
  41. bindingValues: makeBindingValuesMap(),
  42. runtimeHandle: h,
  43. }
  44. }
  45. func makeBindingValuesMap() ctn.Map[uintptr, core.Object] {
  46. var cmp = ctn.DefaultCompare[uintptr]
  47. return ctn.MakeMap[uintptr, core.Object](cmp)
  48. }
  49. func (ctx *EvalContext) Eval(expr *Expr) core.Object {
  50. return expr.Content.Eval(ctx)
  51. }
  52. func (ctx *EvalContext) EvalAll(exprList ([] *Expr)) ([] core.Object) {
  53. var objects = make([] core.Object, len(exprList))
  54. for i := range exprList {
  55. objects[i] = ctx.Eval(exprList[i])
  56. }
  57. return objects
  58. }
  59. func (ctx *EvalContext) EvalAllAsList(exprList ([] *Expr)) core.List {
  60. var nodes = make([] core.ListNode, len(exprList))
  61. for i := range exprList {
  62. nodes[i].Value = ctx.Eval(exprList[i])
  63. }
  64. return core.NodesToList(nodes)
  65. }
  66. func (ctx *EvalContext) EvalBinding(binding *Binding) core.Object {
  67. var ptr = binding.PointerNumber()
  68. var obj, _ = ctx.bindingValues.Lookup(ptr)
  69. return obj
  70. }
  71. func (ctx *EvalContext) NewCtx() *EvalContext {
  72. return &EvalContext {
  73. bindingValues: makeBindingValuesMap(),
  74. runtimeHandle: ctx.runtimeHandle,
  75. }
  76. }
  77. func (ctx *EvalContext) NewCtxMatch(p PatternMatching, obj core.Object) *EvalContext {
  78. var m = ctx.bindingValues
  79. for _, item := range p {
  80. var v core.Object
  81. if item.Index1 == 0 {
  82. v = obj
  83. } else {
  84. var index = (item.Index1 - 1)
  85. var r = (*obj).(core.Record)
  86. v = r.Objects[index]
  87. }
  88. var k = item.Binding.PointerNumber()
  89. m = m.Inserted(k, v)
  90. }
  91. return &EvalContext {
  92. bindingValues: m,
  93. runtimeHandle: ctx.runtimeHandle,
  94. }
  95. }
  96. func (ctx *EvalContext) NewCtxUnbind(binding *Binding) *EvalContext {
  97. var m = ctx.bindingValues
  98. var ptr = binding.PointerNumber()
  99. _, m, _ = m.Deleted(ptr)
  100. return &EvalContext {
  101. bindingValues: m,
  102. runtimeHandle: ctx.runtimeHandle,
  103. }
  104. }
  105. func (ctx *EvalContext) NewCtxBind(binding *Binding, obj core.Object) *EvalContext {
  106. var m = ctx.bindingValues
  107. var ptr = binding.PointerNumber()
  108. m = m.Inserted(ptr, obj)
  109. return &EvalContext {
  110. bindingValues: m,
  111. runtimeHandle: ctx.runtimeHandle,
  112. }
  113. }
  114. func (ctx *EvalContext) NewCtxBindAll(bindings ([] *Binding), objects ([] core.Object)) *EvalContext {
  115. var m = ctx.bindingValues
  116. for i, b := range bindings {
  117. var ptr = b.PointerNumber()
  118. var obj = objects[i]
  119. m = m.Inserted(ptr, obj)
  120. }
  121. return &EvalContext {
  122. bindingValues: m,
  123. runtimeHandle: ctx.runtimeHandle,
  124. }
  125. }
  126. func (ctx *EvalContext) NewCtxCapture(bindings ([] *Binding)) *EvalContext {
  127. var new_ctx = ctx.NewCtx()
  128. var m = &(new_ctx.bindingValues)
  129. for _, b := range bindings {
  130. var ptr = b.PointerNumber()
  131. var obj, _ = ctx.bindingValues.Lookup(ptr)
  132. *m = m.Inserted(ptr, obj)
  133. }
  134. return new_ctx
  135. }
  136. type PatternMatching ([] PatternMatchingItem)
  137. type PatternMatchingItem struct {
  138. Binding *Binding
  139. Index1 int // 0 = whole, 1 = .0
  140. }
  141. type Wrapper struct {
  142. Inner *Expr
  143. }
  144. func (expr Wrapper) Eval(ctx *EvalContext) core.Object {
  145. return ctx.Eval(expr.Inner)
  146. }
  147. type CachedExpr struct {
  148. Expr *Expr
  149. Cache *ExprValueCache
  150. }
  151. type ExprValueCache struct {
  152. available bool
  153. value core.Object
  154. }
  155. func (expr CachedExpr) Eval(ctx *EvalContext) core.Object {
  156. if expr.Cache.available {
  157. return expr.Cache.value
  158. } else {
  159. var value = ctx.Eval(expr.Expr)
  160. expr.Cache.value = value
  161. expr.Cache.available = true
  162. return value
  163. }
  164. }
  165. func Cached(expr *Expr) *Expr {
  166. return &Expr {
  167. Type: expr.Type,
  168. Info: expr.Info,
  169. Content: CachedExpr {
  170. Expr: expr,
  171. Cache: new(ExprValueCache),
  172. },
  173. }
  174. }
  175. type FunRef struct {
  176. Function **Function
  177. Context [] *Expr
  178. Unpack bool
  179. }
  180. func (expr FunRef) Eval(ctx *EvalContext) core.Object {
  181. return core.FunctionToLambdaObject (
  182. (*expr.Function).value,
  183. expr.Unpack,
  184. ctx.EvalAll(expr.Context),
  185. ctx.runtimeHandle,
  186. )
  187. }
  188. type LocalRef struct {
  189. Binding *Binding
  190. }
  191. func (expr LocalRef) Eval(ctx *EvalContext) core.Object {
  192. return ctx.EvalBinding(expr.Binding)
  193. }
  194. type CallLambda struct {
  195. Callee *Expr
  196. Argument *Expr
  197. }
  198. func (expr CallLambda) Eval(ctx *EvalContext) core.Object {
  199. var callee = ctx.Eval(expr.Callee)
  200. var lambda = (*callee).(core.Lambda)
  201. var argument = ctx.Eval(expr.Argument)
  202. return lambda.Call(argument)
  203. }
  204. type CallFunction struct {
  205. Location source.Location
  206. Callee **Function
  207. Context [] *Expr
  208. Arguments [] *Expr
  209. }
  210. func (expr CallFunction) Eval(ctx *EvalContext) core.Object {
  211. var f = *(expr.Callee)
  212. var f_ctx = ctx.EvalAll(expr.Context)
  213. var args = ctx.EvalAll(expr.Arguments)
  214. var h = core.AddFrameInfo(ctx.runtimeHandle, f.name, expr.Location)
  215. return f.value.Call(args, f_ctx, h)
  216. }
  217. type Interface struct {
  218. ConcreteValue *Expr
  219. DispatchTable **DispatchTable
  220. }
  221. func (expr Interface) Eval(ctx *EvalContext) core.Object {
  222. return core.Obj(core.Interface {
  223. UnderlyingObject: ctx.Eval(expr.ConcreteValue),
  224. DispatchTable: (*expr.DispatchTable).value(),
  225. })
  226. }
  227. type InterfaceTransformUpward struct {
  228. Arg *Expr
  229. Path [] int
  230. }
  231. func (expr InterfaceTransformUpward) Eval(ctx *EvalContext) core.Object {
  232. var arg = ctx.Eval(expr.Arg)
  233. var I = (*arg).(core.Interface)
  234. var table = I.DispatchTable
  235. for _, index := range expr.Path {
  236. table = table.Children[index]
  237. }
  238. return core.Obj(core.Interface {
  239. UnderlyingObject: I.UnderlyingObject,
  240. DispatchTable: table,
  241. })
  242. }
  243. type InterfaceTransformDownward struct {
  244. Arg *Expr
  245. Depth int
  246. Target string
  247. }
  248. func (expr InterfaceTransformDownward) Eval(ctx *EvalContext) core.Object {
  249. var arg = ctx.Eval(expr.Arg)
  250. var I = (*arg).(core.Interface)
  251. var table = I.DispatchTable
  252. for i := 0; i < expr.Depth; i += 1 {
  253. table = table.Parent
  254. if table == nil {
  255. break
  256. }
  257. }
  258. if ((table != nil) && (table.Interface == expr.Target)) {
  259. return core.Just(core.Obj(core.Interface {
  260. UnderlyingObject: I.UnderlyingObject,
  261. DispatchTable: table,
  262. }))
  263. } else {
  264. return core.Nothing()
  265. }
  266. }
  267. type InterfaceFromSamValue struct {
  268. Value *Expr
  269. }
  270. func (expr InterfaceFromSamValue) Eval(ctx *EvalContext) core.Object {
  271. var value = ctx.Eval(expr.Value)
  272. return core.Obj(core.CraftSamInterface(value))
  273. }
  274. type Null struct {}
  275. func (expr Null) Eval(_ *EvalContext) core.Object {
  276. return nil
  277. }
  278. type Enum int
  279. func (expr Enum) Eval(_ *EvalContext) core.Object {
  280. var index = int(expr)
  281. return core.Obj(core.Enum(index))
  282. }
  283. type EnumToInt struct {
  284. EnumValue *Expr
  285. }
  286. func (expr EnumToInt) Eval(ctx *EvalContext) core.Object {
  287. var enum_obj = ctx.Eval(expr.EnumValue)
  288. var n = big.NewInt(int64(int((*enum_obj).(core.Enum))))
  289. return core.Obj(core.Int { Value: n })
  290. }
  291. type Union struct {
  292. Index int
  293. Value *Expr
  294. }
  295. func (expr Union) Eval(ctx *EvalContext) core.Object {
  296. return core.Obj(core.Union {
  297. Index: expr.Index,
  298. Object: ctx.Eval(expr.Value),
  299. })
  300. }
  301. type Record struct {
  302. Values [] *Expr
  303. }
  304. func (expr Record) Eval(ctx *EvalContext) core.Object {
  305. return core.Obj(core.Record {
  306. Objects: ctx.EvalAll(expr.Values),
  307. })
  308. }
  309. type FieldValue struct {
  310. Record *Expr
  311. Index int
  312. }
  313. func (expr FieldValue) Eval(ctx *EvalContext) core.Object {
  314. var obj = ctx.Eval(expr.Record)
  315. var record = (*obj).(core.Record)
  316. return record.Objects[expr.Index]
  317. }
  318. type ObservableFieldProjection struct {
  319. Base *Expr
  320. Index int
  321. }
  322. func (expr ObservableFieldProjection) Eval(ctx *EvalContext) core.Object {
  323. var index = expr.Index
  324. var base = ctx.Eval(expr.Base)
  325. var raw = core.GetObservable(base).Map(func(obj core.Object) core.Object {
  326. var record = (*obj).(core.Record)
  327. return record.Objects[index]
  328. })
  329. return core.Obj(raw.DistinctUntilObjectChanged())
  330. }
  331. type ConcreteMethodValue struct {
  332. Location source.Location
  333. This *Expr
  334. Path [] int
  335. Method **Function
  336. }
  337. func (expr ConcreteMethodValue) Eval(ctx *EvalContext) core.Object {
  338. var this = ctx.Eval(expr.This)
  339. if len(expr.Path) > 0 {
  340. var I = (*this).(core.Interface)
  341. var obj = I.UnderlyingObject
  342. var table = I.DispatchTable
  343. for _, index := range expr.Path {
  344. table = table.Children[index]
  345. }
  346. this = core.Obj(core.Interface {
  347. UnderlyingObject: obj,
  348. DispatchTable: table,
  349. })
  350. }
  351. var args = [] core.Object { this }
  352. var f = (*expr.Method)
  353. var h = core.AddFrameInfo(ctx.runtimeHandle, f.name, expr.Location)
  354. return f.value.Call(args, nil, h)
  355. }
  356. type AbstractMethodValue struct {
  357. Location source.Location
  358. Interface *Expr
  359. Path [] int
  360. Index int
  361. }
  362. func (expr AbstractMethodValue) Eval(ctx *EvalContext) core.Object {
  363. var interface_object = ctx.Eval(expr.Interface)
  364. var I = (*interface_object).(core.Interface)
  365. var this = I.UnderlyingObject
  366. var table = I.DispatchTable
  367. for _, index := range expr.Path {
  368. table = table.Children[index]
  369. }
  370. var f = *(table.Methods[expr.Index])
  371. var args = [] core.Object { this }
  372. var h = core.AddFrameInfo(ctx.runtimeHandle, "(dynamic)", expr.Location)
  373. return f.Call(args, nil, h)
  374. }
  375. type List struct {
  376. Items [] *Expr
  377. }
  378. func (expr List) Eval(ctx *EvalContext) core.Object {
  379. return core.Obj(ctx.EvalAllAsList(expr.Items))
  380. }
  381. type InteriorRef struct {
  382. Base *Expr
  383. Index int
  384. Table **DispatchTable // optional, used in dynamic cast
  385. Kind InteriorRefKind
  386. Operand InteriorRefOperand
  387. }
  388. type InteriorRefKind int
  389. const (
  390. RK_RecordField InteriorRefKind = iota
  391. RK_EnumItem
  392. RK_UnionItem
  393. RK_DynamicCast
  394. )
  395. type InteriorRefOperand int
  396. const (
  397. RO_Direct InteriorRefOperand = iota
  398. RO_Lens1
  399. RO_Lens2
  400. )
  401. func (expr InteriorRef) Eval(ctx *EvalContext) core.Object {
  402. var base = expr.Base.Content.Eval(ctx)
  403. switch expr.Kind {
  404. case RK_RecordField:
  405. i := expr.Index
  406. switch expr.Operand {
  407. case RO_Direct: return core.Lens1FromRecord(base, i)
  408. case RO_Lens1: return core.Lens1FromRecordLens1(base, i)
  409. }
  410. case RK_EnumItem:
  411. i := expr.Index
  412. switch expr.Operand {
  413. case RO_Direct: return core.Lens2FromEnum(base, i)
  414. case RO_Lens1: return core.Lens2FromEnumLens1(base, i)
  415. case RO_Lens2: return core.Lens2FromEnumLens2(base, i)
  416. }
  417. case RK_UnionItem:
  418. i := expr.Index
  419. switch expr.Operand {
  420. case RO_Direct: return core.Lens2FromUnion(base, i)
  421. case RO_Lens1: return core.Lens2FromUnionLens1(base, i)
  422. case RO_Lens2: return core.Lens2FromUnionLens2(base, i)
  423. }
  424. case RK_DynamicCast:
  425. t := (*expr.Table).value()
  426. switch expr.Operand {
  427. case RO_Direct: return core.Lens2FromInterface(base, t)
  428. case RO_Lens1: return core.Lens2FromInterfaceLens1(base, t)
  429. case RO_Lens2: return core.Lens2FromInterfaceLens2(base, t)
  430. }
  431. }
  432. panic("something went wrong")
  433. }
  434. type IntLiteral struct {
  435. Value *big.Int
  436. }
  437. func (expr IntLiteral) Eval(_ *EvalContext) core.Object {
  438. return core.Obj(core.Int { Value: expr.Value })
  439. }
  440. type CharLiteral struct {
  441. Value rune
  442. }
  443. func (expr CharLiteral) Eval(_ *EvalContext) core.Object {
  444. return core.Obj(core.Char(expr.Value))
  445. }
  446. type FloatLiteral struct {
  447. Value float64
  448. }
  449. func (expr FloatLiteral) Eval(_ *EvalContext) core.Object {
  450. return core.Obj(core.Float(expr.Value))
  451. }
  452. type BytesLiteral struct {
  453. Value [] byte
  454. }
  455. func (expr BytesLiteral) Eval(_ *EvalContext) core.Object {
  456. return core.Obj(core.Bytes(expr.Value))
  457. }
  458. type StringLiteral struct {
  459. Value string
  460. }
  461. func (expr StringLiteral) Eval(_ *EvalContext) core.Object {
  462. return core.Obj(core.String(expr.Value))
  463. }
  464. type RegexpLiteral struct {
  465. Value *regexp.Regexp
  466. }
  467. func (expr RegexpLiteral) Eval(_ *EvalContext) core.Object {
  468. return core.Obj(core.RegExp { Value: expr.Value })
  469. }
  470. type Lambda struct {
  471. Ctx [] *Binding
  472. In PatternMatching
  473. Out *Expr
  474. Self *Binding
  475. }
  476. func (expr Lambda) Eval(ctx *EvalContext) core.Object {
  477. var capture = ctx.NewCtxCapture(expr.Ctx)
  478. var input_pattern = expr.In
  479. var output_expr = expr.Out
  480. var lambda = core.Obj(core.Lambda { Call: func(arg core.Object) core.Object {
  481. var inner = capture.NewCtxMatch(input_pattern, arg)
  482. return inner.Eval(output_expr)
  483. }})
  484. if expr.Self != nil {
  485. capture = capture.NewCtxBind(expr.Self, lambda)
  486. }
  487. return lambda
  488. }
  489. type Let struct {
  490. In PatternMatching
  491. Arg *Expr
  492. Out *Expr
  493. }
  494. func (expr Let) Eval(ctx *EvalContext) core.Object {
  495. var arg = ctx.Eval(expr.Arg)
  496. var inner = ctx.NewCtxMatch(expr.In, arg)
  497. return inner.Eval(expr.Out)
  498. }
  499. type If struct {
  500. Branches [] IfBranch
  501. }
  502. type IfBranch struct {
  503. Conds [] Cond
  504. Value *Expr
  505. }
  506. type Cond struct {
  507. Kind CondKind
  508. Match PatternMatching
  509. Value *Expr
  510. }
  511. type CondKind int
  512. const (
  513. CK_Bool CondKind = iota
  514. CK_Maybe
  515. CK_Lens2
  516. )
  517. func (expr If) Eval(ctx *EvalContext) core.Object {
  518. for _, branch := range expr.Branches {
  519. var branch_ctx = ctx
  520. var branch_ok = true
  521. for _, cond := range branch.Conds {
  522. var v = branch_ctx.Eval(cond.Value)
  523. switch cond.Kind {
  524. case CK_Bool:
  525. if core.GetBool(v) {
  526. continue
  527. }
  528. case CK_Maybe:
  529. if v, ok := core.UnwrapMaybe(v); ok {
  530. branch_ctx = branch_ctx.NewCtxMatch(cond.Match, v)
  531. continue
  532. }
  533. case CK_Lens2:
  534. if v, ok := core.UnwrapLens2(v); ok {
  535. branch_ctx = branch_ctx.NewCtxMatch(cond.Match, v)
  536. continue
  537. }
  538. default:
  539. panic("impossible branch")
  540. }
  541. branch_ok = false
  542. break
  543. }
  544. if branch_ok {
  545. return branch_ctx.Eval(branch.Value)
  546. }
  547. }
  548. panic("bad if expression")
  549. }
  550. type When struct {
  551. Operand WhenOperand
  552. Branches [] *WhenBranch
  553. }
  554. type WhenBranch struct {
  555. Match PatternMatching
  556. Value *Expr
  557. }
  558. type WhenOperand struct {
  559. Kind UnionOrEnum
  560. Value *Expr
  561. }
  562. type UnionOrEnum int
  563. const (
  564. UE_Union UnionOrEnum = iota
  565. UE_Enum
  566. )
  567. func (expr When) Eval(ctx *EvalContext) core.Object {
  568. switch expr.Operand.Kind {
  569. case UE_Union:
  570. var operand = ctx.Eval(expr.Operand.Value)
  571. var u = (*operand).(core.Union)
  572. var branch = expr.Branches[u.Index]
  573. var inner = ctx.NewCtxMatch(branch.Match, u.Object)
  574. return inner.Eval(branch.Value)
  575. case UE_Enum:
  576. var operand = ctx.Eval(expr.Operand.Value)
  577. var index = int((*operand).(core.Enum))
  578. var branch = expr.Branches[index]
  579. return ctx.Eval(branch.Value)
  580. default:
  581. panic("impossible branch")
  582. }
  583. }
  584. type EachValue struct {
  585. Kind UnionOrEnum
  586. Index int
  587. Match PatternMatching
  588. Value *Expr
  589. }
  590. func (expr EachValue) Eval(ctx *EvalContext) core.Object {
  591. switch expr.Kind {
  592. case UE_Union:
  593. var index = expr.Index
  594. var conv = core.Obj(core.Lambda { Call: func(arg core.Object) core.Object {
  595. return core.Obj(core.Union {
  596. Index: index,
  597. Object: arg,
  598. })
  599. }})
  600. var inner = ctx.NewCtxMatch(expr.Match, conv)
  601. return inner.Eval(expr.Value)
  602. case UE_Enum:
  603. var index = expr.Index
  604. var enum_obj = core.Obj(core.Enum(index))
  605. var inner = ctx.NewCtxMatch(expr.Match, enum_obj)
  606. return inner.Eval(expr.Value)
  607. default:
  608. panic("impossible branch")
  609. }
  610. }
  611. type ObservableRecord struct {
  612. Record Record
  613. }
  614. type ObservableMaybeRecord struct {
  615. Record Record
  616. }
  617. func (expr ObservableRecord) Eval(ctx *EvalContext) core.Object {
  618. var values = ctx.EvalAll(expr.Record.Values)
  619. var observables = ctn.MapEach(values, core.GetObservable)
  620. return core.Obj(core.CombineLatest(observables...).Map(func(combined core.Object) core.Object {
  621. var objects = make([] core.Object, len(values))
  622. core.GetList(combined).ForEachWithIndex(func(i int, obj core.Object) {
  623. objects[i] = obj
  624. })
  625. return core.Obj(core.Record { Objects: objects })
  626. }))
  627. }
  628. func (expr ObservableMaybeRecord) Eval(ctx *EvalContext) core.Object {
  629. var combined = (ObservableRecord { expr.Record }).Eval(ctx)
  630. return core.Obj(core.GetObservable(combined).Map(func(obj core.Object) core.Object {
  631. var r = (*obj).(core.Record)
  632. var unwrapped = make([] core.Object, len(r.Objects))
  633. for i := range r.Objects {
  634. if inner, ok := core.UnwrapMaybe(r.Objects[i]); ok {
  635. unwrapped[i] = inner
  636. } else {
  637. return core.Nothing()
  638. }
  639. }
  640. return core.Just(core.Obj(core.Record { Objects: unwrapped }))
  641. }))
  642. }
  643. type ObservableRecordDefault struct {
  644. Content ExprContent
  645. }
  646. type ObservableMaybeRecordDefault struct {
  647. Content ExprContent
  648. }
  649. func (expr ObservableRecordDefault) Eval(ctx *EvalContext) core.Object {
  650. var v = expr.Content.Eval(ctx)
  651. return core.Obj(core.ObservableSyncValue(v))
  652. }
  653. func (expr ObservableMaybeRecordDefault) Eval(ctx *EvalContext) core.Object {
  654. var v = expr.Content.Eval(ctx)
  655. return core.Obj(core.ObservableSyncValue(core.Just(v)))
  656. }
  657. type HookRecord struct {
  658. Record Record
  659. }
  660. func (expr HookRecord) Eval(ctx *EvalContext) core.Object {
  661. var values = ctx.EvalAll(expr.Record.Values)
  662. var jobs = ctn.MapEach(values, func(v core.Object) core.Observable {
  663. return core.FromObject[core.Hook](v).Job
  664. })
  665. var result = core.ObservableSyncValue(core.Obj(core.EmptyList()))
  666. var L = len(jobs)
  667. for i := (L-1); i >= 0; i -= 1 {
  668. result = (func(current core.Observable, next core.Observable) core.Observable {
  669. return current.AwaitNoexcept(ctx.runtimeHandle, func(head core.Object) core.Observable {
  670. return next.AwaitNoexcept(ctx.runtimeHandle, func(tail_obj core.Object) core.Observable {
  671. var tail = core.GetList(tail_obj)
  672. var list = core.Cons(head, tail)
  673. return core.ObservableSyncValue(core.Obj(list))
  674. })})
  675. })(jobs[i], result)
  676. }
  677. { var result = result.Map(func(obj core.Object) core.Object {
  678. var list = core.GetList(obj)
  679. var objects = make([] core.Object, list.Length())
  680. list.ForEachWithIndex(func(i int, object core.Object) {
  681. objects[i] = object
  682. })
  683. return core.Obj(core.Record { Objects: objects })
  684. })
  685. return core.ToObject(core.Hook { Job: result }) }
  686. }
  687. type HookRecordDefault struct {
  688. Content ExprContent
  689. }
  690. func (expr HookRecordDefault) Eval(ctx *EvalContext) core.Object {
  691. var v = expr.Content.Eval(ctx)
  692. var o = core.ObservableSyncValue(v)
  693. return core.ToObject(core.Hook { Job: o })
  694. }
  695. type ReflectType struct {
  696. Type ReflectType_
  697. }
  698. func (expr ReflectType) Eval(_ *EvalContext) core.Object {
  699. var t = core.ReflectType(expr.Type)
  700. return core.Obj(t)
  701. }
  702. type ReflectValue struct {
  703. Type ReflectType_
  704. Value *Expr
  705. }
  706. func (expr ReflectValue) Eval(ctx *EvalContext) core.Object {
  707. var t = core.ReflectType(expr.Type)
  708. var v = ctx.Eval(expr.Value)
  709. return core.Obj(core.AssumeValidReflectValue(t, v))
  710. }