Path: csiph.com!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!news.misty.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: Kaz Kylheku <217-679-0842@kylheku.com> Newsgroups: comp.compilers Subject: Re: Add nested-function support in a language the based on a stack-machine Date: Fri, 2 Mar 2018 00:38:30 +0000 (UTC) Organization: Aioe.org NNTP Server Lines: 34 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <18-03-008@comp.compilers> References: <18-02-009@comp.compilers> <18-02-012@comp.compilers> <18-02-016@comp.compilers> <18-02-018@comp.compilers> <18-02-023@comp.compilers> <18-02-029@comp.compilers> <18-02-032@comp.compilers> <18-02-034@comp.compilers> <18-03-002@comp.compilers> <18-03-006@comp.compilers> Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="2038"; mail-complaints-to="abuse@iecc.com" Keywords: code, design, comment Posted-Date: 01 Mar 2018 21:37:29 EST X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: csiph.com comp.compilers:1969 On 2018-03-01, Kaz Kylheku <217-679-0842@kylheku.com> wrote: > John: > [A display is an array of pointers to the frames of the enclosing > scopes. You can access any variable in an enclosing frame by > indirecting through the frame's entry in the current display and then > indexing. This is for languges like Algol and Pascal, not Lisp. I This is absolutely relevant to Lisp dialects with lexical scoping, like Common Lisp and Scheme (or anything worth its salt, really). There are no first-class functions without lexical scoping. Structure and Interpretation of Computer Programs (SICP) discusses something similar to displays in "5.5.6 Lexical Addressing": https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-35.html#%_sec_5.5.6 "We can exploit this fact by inventing a new kind of variable-lookup operation, lexical-address-lookup, that takes as arguments an environment and a lexical address that consists of two numbers: a frame number, which specifies how many frames to pass over, and a displacement number, which specifies how many variables to pass over in that frame. Lexical-address-lookup will produce the value of the variable stored at that lexical address relative to the current environment." The focus of that section is eliminating the run-time search which actually finds a name by symbol matching, with numeric indexing. However, if we can "pass over" the frames by indexing through a vector of them, then we have a display. We can also directly index into the frame by also representing it as a vector, so we don't have to "pass over" n-1 variables to get to the n-th one. [I was thinking of closures when I said not Lisp. I suppose you could use displays and garbage collect them but I haven't really thought about the implications. -John]