[HN Gopher] Pocketlang
       ___________________________________________________________________
        
       Pocketlang
        
       Author : tsujp
       Score  : 209 points
       Date   : 2021-06-22 07:10 UTC (15 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | rcarmo wrote:
       | This is pretty neat. I've been tinkering with Lua on ARM, so I'm
       | curious to know how it compares to LuaJIT.
        
         | pansa2 wrote:
         | Like regular Lua, Pocketlang uses a bytecode interpreter. AFAIK
         | LuaJIT is still the only small language implementation that
         | provides a JIT compiler and not just an interpreter.
         | 
         | I don't know why that is - maybe there just isn't much of a
         | niche for a lightweight JIT compiler.
        
           | thayne wrote:
           | Probably because a JIT conflicts with the goal of most
           | embedded languages to be small and simple. LuaJIT does manage
           | to be relatively small, but it (meaning the implementation)
           | certainly isn't simple.
        
         | tsujp wrote:
         | If you like Lua and like Lisp-y languages you might like:
         | https://github.com/bakpakin/Fennel which compiles to Lua.
        
           | rcarmo wrote:
           | Using that already ;)
        
       | meneoune wrote:
       | Nice language, but unless I'm mistaken, it's not a functional
       | language but an imperative one.
        
       | fsloth wrote:
       | This looks nice! Is there a sample how to implement your own
       | module in C and bind that to the scripting language?
       | 
       | [Edit]: To answer myself the API seems really clean and neat, it
       | looks like the patterns used to implement the standard modules
       | can be used as is - e.g. to implement a third party native
       | module, a good pattern to start from is to observe how _fileOpen
       | is implemented in cli/modules.c and added to module using
       | pkModuleAddFunction
        
       | tsujp wrote:
       | The language also has a website homepage too:
       | https://thakeenathees.github.io/pocketlang/
        
       | hvis wrote:
       | Ruby-like language with imports inspired by Python, what's not to
       | like.
        
       | __ryan__ wrote:
       | > The language is written using Wren Language and their wonderful
       | book Crafting Interpreters as a reference.
       | 
       | I had to read this a few times to understand that this isn't
       | saying that Pocketlang is not written in Wren. I was looking for
       | Wren code in the repo and I was slightly confused.
       | 
       | Very cool project though! I always love to see projects inspired
       | by Crafting Interpreters.
        
         | sicromoft wrote:
         | > I had to read this a few times to understand that this isn't
         | saying that Pocketlang is not written in Wren
         | 
         | I had to read _that_ a few times to understand what I think is
         | an unintentional double negative on your part.
        
           | blauditore wrote:
           | So, to decrypt this:
           | 
           | The author used Wren as an example/reference on how to build
           | a programming language, but built something unrelated to it.
           | 
           | Correct?
        
         | leephillips wrote:
         | Do you usually read the second paragraph first?
        
           | dang wrote:
           | Please don't be a jerk in HN comments.
           | 
           | https://news.ycombinator.com/newsguidelines.html
        
         | EllieEffingMae wrote:
         | As do I! Crafting interpreters is definitely one of the coolest
         | programming books I've ever read. I used it as a blueprint for
         | busing more than one parser in my time :D
        
         | veganjay wrote:
         | I was about to post similar because in the git repo it also
         | states:
         | 
         | > Pocketlang is a small (~3000 semicolons) and fast functional
         | language written in C
         | 
         | From what I can tell from the comments, pocketlang re-uses
         | and/or re-implements some functionality from the wren language
         | source code:                   $ grep wren src/*.h src/*.c
         | src/pk_compiler.c:  /* String interpolation (reference wren-
         | lang)         src/pk_utils.h:// Source :
         | https://github.com/wren-
         | lang/wren/blob/main/src/vm/wren_utils.h#L119
         | src/pk_utils.h:// Copied from wren-lang.         src/pk_var.h:
         | * wren (https://wren.io/) an awesome language written by Bob
         | Nystrom the         src/pk_var.h: *
         | https://github.com/wren-lang/wren/blob/main/src/vm/wren_value.h
         | src/pk_var.h:// usage and it has 2 formated characters (just
         | like wren does).
        
       | prionassembly wrote:
       | Stuff like this is so cool.
       | 
       | I have this desire to create a (maybe domain-specific / not
       | Turing) programming language. I have some use cases involving
       | constraint satisfaction but basically it's a rock'n roll dream
       | kind of thing for me.
        
         | watwut wrote:
         | Do write it. It is easier then it sounds and quite pleasant
         | programming task.
        
       | dvh wrote:
       | Cute but pkInterpretSource() doesn't have any throttling, like
       | the amount of instructions/nodes to execute before suspending,
       | this would be very useful in games. You could limit NPC's ai to
       | 50 instructions or so so that it doesn't cause rendering lag and
       | the ai script would be run in multiple frames until it finishes.
        
         | flohofwoe wrote:
         | I guess the fiber/coroutine support would be a better solution
         | to this problem? If this works like I think it should work, the
         | code can decide itself when it is a good time to yield control
         | back to the environment instead of freezing execution in a
         | random location until the next frame.
         | 
         | For instance when evaluating NPC AIs it may be important that
         | an NPC isn't left dangling in a random state at the end of a
         | frame, but either has finished evaluating, or hasn't started
         | yet.
         | 
         | https://thakeenathees.github.io/pocketlang/language-api-fibe...
        
           | dvh wrote:
           | Code cannot decide when to yield because it doesn't know how
           | many NPCs I am running in one frame. Maybe I need 10, maybe 2
           | longer and 8 just quickly for long running/low complexity
           | jobs. If the limit is reached in the middle of "if"
           | statement, e.g.                   if x < sin(5) + cos(20)
           | then y = 5;
           | 
           | If "x" and "sin(5)" was evaluated but not "cos(20)" then it
           | should just remember VM state and continue next time. I did
           | this in JS and it worked great for distributing NPC load
           | between frames (https://twitter.com/dusan_halicky/status/1173
           | 924435923001344) and it didn't required any understanding of
           | the code (I didn't need to carefully check when I need to
           | stop execution), just VM snapshot and continue next frame.
        
             | skybrian wrote:
             | Since it's a small language that already supports yielding
             | for I/O, it shouldn't be too hard to automatically insert
             | an instruction into all loops to check if they need to
             | pause. You could write it manually to prototype.
             | 
             | (Or at least I assume it works that way based on studying
             | Wren.)
        
         | pansa2 wrote:
         | > _You could limit NPC 's ai to 50 instructions or so_
         | 
         | The problem with this approach is that limiting the number of
         | instructions doesn't necessarily limit the amount of time
         | taken. Any single VM instruction could be a call into a C
         | function that performs a long-running computation.
         | 
         | If you want to robustly limit the amount of time a script runs
         | for, you have to actually time it.
        
       | douglas5962 wrote:
       | Thanks for the information keep sharing such informative post
       | keep suggesting such post.
       | 
       | https://www.mygiftcardsite.win/
        
       | pansa2 wrote:
       | > _Pocketlang is a [...] functional language written in C._
       | 
       | What features make this a _functional_ language?
        
         | mumblemumble wrote:
         | That's always a fun subject for a late night argument at the
         | pub.
         | 
         | When I was in school (1990s), simply having first-class
         | procedures was good enough for most people to consider a
         | language functional. I'd assume that's roughly the definition
         | being used here.
         | 
         | But you go back to 20 years before that, and it wasn't totally
         | unheard of to see higher-order functions in procedural
         | languages (such as Algol 68) and object-oriented languages
         | (such as Smalltalk). And you fast forward 20 years, and about
         | the only language without some form of first-class procedures
         | that's still allowed to exist seems to be C. And in the middle
         | there's always been Python.
         | 
         | You could go all purist and say that, since John Backus coined
         | the term, we should stick with his definition. In that case
         | lisps are definitely out (he explicitly said so in his paper),
         | and it's possible that the only genuine examples are Miranda,
         | Haskell and friends, because even allowing mutation or an
         | imperative style will disqualify you. But I'm not sure everyone
         | really wants to snub Robin Milner like that.
         | 
         | It's almost like it's an ill-defined term with fuzzy boundaries
         | that means whatever the person currently using it wants to tell
         | you they meant by it, and trying to be pedantic about it is
         | mostly just a good way to have a frustrating conversation. Kind
         | of like just about every adjective that can be used to describe
         | programming languages.
        
           | nvarsj wrote:
           | I thought Miranda/Haskell were much more in the vein of
           | Lisp/Lambda Calculus than Backus's ideas, which were more
           | radical and not widely adopted to this day [1]. I always
           | thought of Haskell as simply what Lisp would be if it had
           | implemented a typed lambda calculus rather than an untyped
           | one.
           | 
           | 1: https://en.wikipedia.org/wiki/Function-level_programming
        
         | ibraheemdev wrote:
         | Probably just referring to the fact that it is not object
         | oriented. Not "functional" in the sense of pure functional
         | programming.
        
         | rottc0dd wrote:
         | I think it is not a purely functional language, but supports
         | functions as first class citizens.
         | 
         | > func(x) return x*x end # Lambda/literal functions. [1]
         | 
         | [1] - https://thakeenathees.github.io/pocketlang/getting-
         | started-l...
        
         | thayne wrote:
         | Perhaps they mean functional in the sense that it works? ;)
        
           | zoom6628 wrote:
           | That's my take too.
        
       | mirthless wrote:
       | What about generic algorithms like filter/map. Is it python style
       | like map(fn, filter(...))?
        
         | jorams wrote:
         | Looks like it supports higher order functions, so you could
         | just implement those yourself.
        
       | ModernMech wrote:
       | I love all new pl projects posted to hn, it's the main reason I
       | come here. This one seems cool and I love the logo especially.
       | 
       | My suggestion to the author is to think more on the selling
       | points of the lang. is it the intention of this language is
       | remain small and fast, or is it just a temporary property of the
       | language because it is so new? Most languages start out as fast
       | as C on toy problems, and then slow down as programs become
       | larger as the language becomes more capable. Often it's the case
       | then you implement the cool features you want your language to
       | have, it's several orders of magnitude slower than when you
       | started. That's why so much time is spent on compiler
       | optimizations.
        
       | throwaway894345 wrote:
       | I love these little embedded languages, but I really want one
       | that supports type annotations. I'm specifically want something
       | that can generate large configuration structures (e.g.,
       | Kubernetes YAMLs, CloudFormation YAMLs, Terraform HCLs, etc) and
       | I want some static typing because the iteration loops can be
       | quite long (minutes) which is too long to test every branch and
       | writing and maintaining unit tests to catch type errors is a huge
       | waste of time.
        
         | aarghh wrote:
         | It sounds like CUE - https://cuelang.org/docs/about/ may be
         | useful to you.
        
           | throwaway894345 wrote:
           | I've tried Cue, it gives you a type system for static JSON,
           | but the support for functions seems either absent or very,
           | very convoluted. I want to expose this configuration language
           | as an interface to my tools, so the configuration language
           | needs to be somewhat familiar (no need to reinvent functions
           | poorly).
        
         | WmyEE0UsWAwC2i wrote:
         | Sounds like https://dhall-lang.org/
        
           | throwaway894345 wrote:
           | It's close. I also want something that is going to be
           | syntactically familiar to humble programmers (my target
           | users, myself, etc); Dhall's syntax is clearly Haskell-
           | adjacent which is an obstacle for many of us. I'll probably
           | just roll my own using a Rust-like syntax.
        
             | nine_k wrote:
             | I frankly think that alternative syntaxes for the same
             | languages ought to be a thing. Case in point: OCaml and
             | Reason.
             | 
             | I can imagine a curly-braced syntax for Dhall (BTW Haskell
             | does have curly-braced syntax when you need it), curly-
             | braced syntax for Python, etc. Indent-based syntax for HTML
             | was implemented (but I forgot the name).
             | 
             | Also, RTL syntax and Arabic / Hebrew keywords for languages
             | have also been implemented; this must be a huge help to
             | those whose native writhing systems are RTL. Try writing
             | your code right-indented and with all expressions
             | backwards.
        
             | adsharma wrote:
             | Would your users be ok with something like this? Python
             | syntax, rust concepts and transpiles to rust (and 6 other
             | languages)
             | 
             | https://twitter.com/arundsharma/status/1407229297392115713
        
               | throwaway894345 wrote:
               | The syntax seems generally fine (Python's type annotation
               | syntax is shoe-horned to minimize changes to the parser--
               | if you're allowing yourself to rewrite the parser, why
               | not improve the type annotations? Indeed, why not stick
               | to a more Rust-like syntax in general?). I would want the
               | ability to restrict the standard library and builtins (no
               | I/O) a la Lua. Also, if the type system involves a borrow
               | checker, I'll pass (borrow checking is cool but it
               | doesn't make sense in what is ultimately intended to be a
               | configuration language).
        
               | adsharma wrote:
               | I'm open to having another syntax, another parser that
               | produces the same AST. Let the market decide. No borrow
               | checker concepts in the source, but transpiled rust code
               | of course uses the borrow checker.
               | 
               | The python standard library is where I think the strength
               | of this approach lies. Was reading some history on why
               | reddit was rewritten in python (after initially
               | implemented in LISP).
               | 
               | Transpiling python stdlib is a significant task in itself
               | and could use more love.
        
               | throwaway894345 wrote:
               | Having a stdlib is fine, but it's incompatible with an
               | embedded scripting language where we want to provide and
               | control the APIs that are available to the user. It
               | sounds like you're building a general purpose application
               | programming language which is fine, but the tradeoffs
               | differ.
        
               | adenozine wrote:
               | All of your comments are just spamming this library that
               | nobody uses.
        
             | creata wrote:
             | If you don't mind, what is it about the syntax of Dhall
             | that you find hard?
             | 
             | In my experience, Haskell's syntax is much simpler than the
             | syntax of any of the popular languages. The "hard" parts of
             | Haskell come with all the abstractions people make (esp.
             | how it encodes side effects), the laziness, and the
             | language extensions. Dhall has none of those.
        
               | throwaway894345 wrote:
               | It seems to be a very polarizing topic. People who like
               | Haskell's syntax find it very readable, others don't. In
               | my estimation, there are a lot more in the "others"
               | category than in the Haskell category. Whether my target
               | audience has trouble with Haskell syntax because of some
               | inherent property of the syntax or merely because their
               | background isn't in Haskell doesn't ultimately matter--
               | the requirement is that my users can quickly be
               | productive (minimal learning curve, etc).
               | 
               | To be very explicit, I'm dodging the question because
               | it's ultimately subjective and people come out of the
               | woodwork with the same predictable talking points
               | ("syntax doesn't matter", "but it's VERY readable! look
               | how few characters!") and I don't have the energy this
               | morning.
        
               | creata wrote:
               | > it's ultimately subjective... and I don't have the
               | energy this morning.
               | 
               | Fair enough, but I've never seen anyone make either of
               | the talking points that you claim are common, and they
               | would be very silly things to say.
        
               | iovrthoughtthis wrote:
               | Did you just ask for someones opinions on the syntax just
               | so you could call them silly?
        
               | creata wrote:
               | I think you misread, but maybe I should've worded it more
               | clearly: the silly people are those hypothetical people
               | who say that "syntax doesn't matter" and "fewer
               | characters means better syntax".
        
               | throwaway894345 wrote:
               | > I've never seen anyone make either of the talking
               | points that you claim are common
               | 
               | Count yourself lucky
               | 
               | > they would be very silly things to say
               | 
               | I tend to agree
        
       | pitr wrote:
       | Off topic: for those thinking it was a programming language
       | optimized for a phone (like I did) the only one I've seen come
       | close to being usable is J (APL derivative). I've been able to
       | solve quite a few advent of code challenges this way:
       | 
       | 1. App https://apps.apple.com/de/app/j701/id1255235993?l=en
       | (there's an android version I believe)
       | 
       | 2. Copy input from page
       | 
       | 3. `+/ ".jgetcb''` to get sum
        
         | alanbernstein wrote:
         | I've just barely begun learning about the APL languages, but I
         | have this tab open that you might be interested in:
         | https://wjmn.github.io/posts/j-can-look-like-apl/
        
       ___________________________________________________________________
       (page generated 2021-06-22 23:01 UTC)