Comments (3)
Ah, you have found a little quirk of the scoping policy. First of all, user-defined functions are an Eidos thing, not a SLiM thing, so they are not officially SLiMEidosScriptBlock
s, and should not have self
defined for themselves. So the function itself does not set up self
, and that is correct. Second, variables that are defined in the calling scope are not visible in a called function, so if you were just trying to access x
in the function and defining it x
in the calling scope you would get an error, and that is correct. Third, SLiM-defined globals are not normal variables; they exist in the global scope. This is why sim
and so forth are visible inside user-defined functions in SLiM; it's a special scoping hack that SLiM does. Fourth, self
is a SLiM-defined global, so it follows those rules – it exists in the global scope and is visible inside called functions. So that also makes sense (arguably – this is all a bit strange and ad hoc, since it is SLiM hacking its way into Eidos without following all the rules). Fifth – and this is where the bug is – self
and other SLiM globals are only set up by SLiM if the interpreter detects that they are being used. If you reference self
in a SLiM script block, then self
gets set up by SLiM; if you don't, SLiM doesn't bother setting it up. This is a good policy; it makes setting up the interpreter for callbacks much faster, since most callbacks don't use most of the pseudo-parameters that are officially defined for them. But your function references self
, which SLiM is not smart enough to figure out means that self
needs to be set up for the early()
event. It ought to be defined and visible in your function, but it isn't because of SLiM's optimization of the variable setup.
So, yes, a bug. I'm not sure what exactly I would want to do to fix it; the Eidos/SLiM scoping rules are all a little bit ad hoc and really I'd like to eventually fix them to be more coherent. In any case, although this is technically a bug I don't imagine it is really getting in your way, is it? Is this causing any difficulties for you? If you need it fixed I can figure out a fix, but otherwise I'll probably just ignore this issue until such time as I revisit the scoping rules in SLiM 4.0 or whatever. :->
from slim.
Thanks @bhaller. Yes, you should absolutely close this as "won't fix". Out of curiosity though, are there other global variables with the same behaviour?
from slim.
All callback pseudo-parameters, I think. They're listed in chapter 24. I'll keep the issue open for now; there is a bug here, and it's a good reminder to think more about scoping some day.
from slim.
Related Issues (20)
- 4.1 Memory Issue HOT 6
- SLiMgui should offer to load external script changes HOT 7
- Wrap Eidos code edition/analysis features into a proper language server. HOT 1
- Slim 4.1 core dumping on computing cluster HOT 19
- small bug in docs HOT 1
- missing parents when using addRecombinant() HOT 2
- "pretty" option for serialize() HOT 2
- Inconsistent global-variable behavior from `x = 1` versus `x = x + 1` HOT 11
- Compiling Eidos script. HOT 13
- Software depends on Qt patch version? HOT 7
- improve recipe 17.5 by using tspop or link_ancestors
- SLiM 4.2 release process HOT 23
- QtSLiM *Open Recipe* list is sorted lexicographically rather than naturally HOT 5
- "buffer overflow detected" when trying to install SLiM on Linux HOT 29
- provide `make test` functionality to run tests after building `slim` and `eidos`
- SLiM 4.2.1 release process HOT 11
- Name collision between binaries and directories prevents linking with `ld` on RHEL 8 HOT 4
- Ubuntu SLiM install error HOT 20
- SLiM 4.2.1 fc 3 release process HOT 9
- 4.2.2 release process HOT 9
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 slim.