Comments (5)
This is a short-coming we have at the moment. local
is a modifier for a property; not a "variable." It really behaves like a property, which is why you can't have one in a for
generator (because it's the same as generating the same property - possibly with different values - over and over).
If, as in this case, you only use it in one expression, you can use let
;
object {
for (x in XS) {
let (plusOne = x + 1)
plusOne
}
}
If you do need it in multiple places, a (admittedly sub-optimal) workaround is to use a for
generator again;
object {
for (x in XS) {
for (plusOne in List(x + 1)) {
plusOne
}
}
}
from pkl.
My case was initially trying to group objects and map each subgroup under different properties of the result, but don't add the result property if the corresponding subgroup is empty. And another loop on top of that.
It went like this
Attempt 1: local variable in for-loop
class Entity {
selectors: Listing<Selector>
}
class Selector {
enabled: Boolean
index: Int
}
hidden objects = new Listing<Entity> {
new {
selectors {
new {
enabled = false
index = 1
}
new {
enabled = true
index = 2
}
}
}
new {
selectors {
new {
enabled = false
index = 3
}
new {
enabled = true
index = 4
}
}
}
}
result: Listing = new {
for (o in objects) {
local grouped = o.selectors.toList().groupBy((x) -> x.enabled)
new {
when (grouped.containsKey(true)) {
all_enabled {
for (a in grouped[true]) {
a.index
}
}
}
when (grouped.containsKey(false)) {
all_disabled {
for (a in grouped[false]) {
a.index
}
}
}
}
}
}
Error:
A for-generator cannot generate object properties (only entries and elements).
Attempt 2: local variable inside leaf object
result: Listing = new {
for (o in objects) {
-
new {
+ local grouped = o.selectors.toList().groupBy((x) -> x.enabled)
when (grouped.containsKey(true)) {
Error:
Cannot find property `grouped`.
42 | when (grouped.containsKey(true)) {
^^^^^^^
Attempt 3: instance methods
I eventually was able to solve the problem with some instance methods on Entity.
However both errors above were rather unexpected for me. Curiously, removing when
s second piece of code starts to work.
from pkl.
If you do need it in multiple places, a (admittedly sub-optimal) workaround is to use a for generator again;
I actually tried that as well! Doesn't work either, apparently because all_enabled
/all_enabled
are properties as well, and that artificial for-loop would need to generate them.
from pkl.
Works for me with that for
-as-let
, because all_enabled
/all_disabled
live inside that new {...}
(which, btw, do you realise/intend that to be Dynamic
)?
result: Listing = new {
for (o in objects) {
for (grouped in List(o.selectors.toList().groupBy((x) -> x.enabled))) {
new {
when (grouped.containsKey(true)) {
all_enabled {
for (a in grouped[true]) {
a.index
}
}
}
when (grouped.containsKey(false)) {
all_disabled {
for (a in grouped[false]) {
a.index
}
}
}
}
}
}
}
but also... this pattern of splitting a collection in two sub-collections based on a property is commonly called partitioning. Pkl has a partition
method Collection
, so I'd
result: Listing = new {
for (o in objects) {
let (partitionedSelectors = o.selectors.toList().partition((it) -> it.enabled))
new {
all_enabled {
...partitionedSelectors.first.map((it) -> it.index)
}
all_disabled {
...partitionedSelectors.second.map((it) -> it.index)
}
}
}
}
(I'm omitting the when
s around all_enabled
and all_disabled
, assuming that them being empty and them being null
are equivalent; if not; you'd need to bring some when
s back)
from pkl.
Works for me with that for-as-let, because all_enabled/all_disabled live inside that new {...}
Should've tried that! I've put it inside new
before.
which, btw, do you realise/intend that to be Dynamic?
That's an example. Does it matter?
but also... this pattern of splitting a collection in two sub-collections based on a property is commonly called partitioning
That's nice! Thanks for the hint.
To summarize what I felt was inconvenient:
for
refusing to produce properties even if it is executed once: should be regular "double declaration error" insteadlocal
being quasi-property instead of syntax sugar... maybe block form oflet
statement which could yield multiple members could be introduced insteadwhen
not seeing members which are defined at the same level
Hope will be addressed in the future versions!
from pkl.
Related Issues (20)
- Suggestion: Absent value for removing members HOT 1
- `pkl-server` should expose both a transport schema version and the version of Pkl itself HOT 1
- Use pkl to validate existing config files HOT 2
- Feature Request: Improve VSCode plugin and publish it in the Marketplace
- `json.Parser` should throw an error when `useMapping = false` and key "default" is encountered HOT 1
- Implement nested types HOT 1
- Xcode integration?
- Allow Basic Authentication in http_proxy
- Koltin generator fails with "'copy' overrides nothing." for subclasses of abstract class HOT 1
- Support SpringBoot nested jar file
- 🐛`fixed` properties not respected by `toTyped()` HOT 3
- Refer to functions through their identifiers HOT 2
- Output converters should allow selection for properties by Annotation HOT 1
- binary serialization HOT 8
- Glob reading with the `file:` schema fails on some paths HOT 5
- Possible race condition when eval'ing packages in concurrently HOT 1
- Renaming the project from pkl because of prior existing python pickle file format HOT 1
- Performance inspection tools
- Statically analyze imports of a Pkl program
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pkl.