Re: [racket-users] Need help improving a macro
On Wed, Aug 30, 2017 at 11:08 AM, wrote: > How did other people learn Racket meta programming? > I don't consider myself a huge expert in macros, but personally I found the "Examples" section of the syntax/parse documentation very helpful ( http://docs.racket-lang.org/syntax/stxparse.html), as well as Greg Hendershot's "Fear of Macros" ( http://www.greghendershott.com/fear-of-macros/). As with everything else, though, there's no substitute for just getting experience actually writing and debugging some macros. > It looks like your macro is turning strings into symbols. > It looks like that because strings `display` without quotation marks (try `(displayln "I am a string.")`). If you want use `syntax->datum`, try `println` instead. (Also, probably obviously, I only defined `register-nvim-function!` as a macro for illustrative purposes.) The `#:with` directive mathes the `opt ...` pattern against a syntax > object which has been constructed out of all the non-name pairs. Yes. The two tricky things are that I include the keywords themselves as well as their value expressions for easy destructuring later and that drop any clause that doesn't appear. Using a `#:defaults` declaration is an alternative, but personally I've come to the point of view that you should avoid having the default value expression repeated both in the function and in the macro. > But how does the `name` attribute get its value? Because it's not an `opt`? > The name attribute gets its value from the `name` pattern variable. The `#:attributes` declaration is strictly optional, but I like it both for my own ease of understanding later and because it is checked. > The `raw-lhs` is the thing we want defined. How does it know to match > both `foo` and `(foo bar baz)`? > > I don't understand why we need this. It takes apart a definition we > built on the fly, takes it apart, but in the template we put thing back > together in the same order: > Because `raw-lhs` is annotated as an `expr`, it matches anything that isn't a keyword, including both `name` and `(name arg1 arg2)`, as well as keyword and optional arguments, for example. Then `normalize-definition` handles converting the `define`-like form into a plain identifier to be defined and a single `λ` expression, including checking for other subtle errors like duplicate argument identifiers. With `syntax-parse` it's much easier to write those sort of checks yourself than it was with just `syntax-case`, but I personally still like the library function. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] GUI for ffmpeg and mrlib/terminal
On Aug 30, 2017, at 10:23 AM, Neil Van Dyke wrote: > Considering that "ffmpeg" is normally non-interactive, you don't necessarily > need full terminal functionality. You just need something like Racket > `subprocess` or `process*/ports`, and to write I/O-ish code to monitor the > stdout and stderr output, and do appropriate GUI things. > > Specifically, you might want to do a few things with the stdout/stderr output: > * Store some raw form of it (space-limited, like ring buffer), in case user > selects to show this in a GUI text viewer, or display it as ffmpeg runs. > * Monitor it for error messages (you can use regexps), and present them in a > GUI-friendly way. > * Monitor it for progress information, and turn that into a GUI progress bar > or similar, since ffmpeg can take minutes or hours to run. Right. It would be good to handle error messages but there are also warnings and prompts. For example, if the output file already exists, it asks whether you want to overwrite. Warnings should be shown prominently but not reacted to. Currently, I am using the cleanup-thunk from MrLib Terminal to notify the user when the process is done but a progress bar would be much nicer. Ffmpeg has a --progress parameter which sends progress information to a url. That may be useful. James -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[racket-users] scribble/example and HtDP languages
How can I make definitions-area examples using the HtDP languages in Scribble? I tried the following, but since the evaluator corresponds to the interactions-area, it complains about definitions not being allowed: #lang scribble/manual @(require racket/sandbox scribble/example) @title{Notes} @(define my-evaluator (parameterize ([sandbox-output 'string] [sandbox-error-output 'string]) (make-evaluator '(lib "lang/htdp-beginner.ss" @examples[ #:no-prompt #:eval my-evaluator (define (distance x y) (sqrt (+ (sqr x) (sqr y (distance (distance 3 4) 5)] -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[racket-users] Racket function to get data from a Google Sheet?
Has anybody written a Racket function to extract the data directly from a Google Sheet? I know I can export the Google sheet as a csv, and then use read-csv-file, but I'd like to automate the export step. --Mitch -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] GUI for ffmpeg and mrlib/terminal
(Although to be clear, slideshow-repl will show you how you can set up a repl rather than a terminal. But I suspect they will be similar in the gui-building respect.) ~Leif Andersen On Wed, Aug 30, 2017 at 2:00 PM, Leif Andersen wrote: >> Another thing you can look at is my Rackterm package[1]. > > Wow, that's nifty. :) > >> Still, I'm also interested in the original question: if I wanted an >> interactive GUI terminal in Racket, what's the best way to do it? > > Fair. Will's RacketTerm project looks like a good resource. Another > resource I think is very helpful is Matthew's `slideshow/repl` > package: https://github.com/mflatt/slideshow-repl > > Specifically, it shows you how you can make a repl text in an editor% > in a frame%. Specifically, I would recommend checking out: > > `slideshow/private/editor.rkt` in that repo. The two classes > slide:text% and repl-text% (lines 58-368) should show you how to get > started. > > The mrlib/terminal library is cool, but it hasn't been touched for 5 > or so years. > > ~Leif Andersen > > > On Wed, Aug 30, 2017 at 12:24 PM, William G Hatch wrote: >> On Wed, Aug 30, 2017 at 09:57:01AM -0400, David Storrs wrote: >>> >>> Still, I'm also interested in the original question: if I wanted an >>> interactive GUI terminal in Racket, what's the best way to do it? >> >> >> Another thing you can look at is my Rackterm package[1]. It is currently an >> undocumented mess (and the first Racket project I made over a couple hundred >> lines), but it is also a reasonably compliant xterm that handles >> colors/styles, curses applications (eg. emacs and vim work fine in it), etc. >> I've always intended to clean up the parser and make it available as a >> library for applications that want to parse and use input with ANSI control >> characters in it, make the various pieces available as stable interfaces for >> embedding terminals into applications, etc. I haven't gotten around to >> doing that, but there is an unstable terminal-canvas.rkt that provides the >> terminal gui widget. >> >> [1] https://github.com/willghatch/rackterm >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Racket Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to racket-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] GUI for ffmpeg and mrlib/terminal
> Another thing you can look at is my Rackterm package[1]. Wow, that's nifty. :) > Still, I'm also interested in the original question: if I wanted an > interactive GUI terminal in Racket, what's the best way to do it? Fair. Will's RacketTerm project looks like a good resource. Another resource I think is very helpful is Matthew's `slideshow/repl` package: https://github.com/mflatt/slideshow-repl Specifically, it shows you how you can make a repl text in an editor% in a frame%. Specifically, I would recommend checking out: `slideshow/private/editor.rkt` in that repo. The two classes slide:text% and repl-text% (lines 58-368) should show you how to get started. The mrlib/terminal library is cool, but it hasn't been touched for 5 or so years. ~Leif Andersen On Wed, Aug 30, 2017 at 12:24 PM, William G Hatch wrote: > On Wed, Aug 30, 2017 at 09:57:01AM -0400, David Storrs wrote: >> >> Still, I'm also interested in the original question: if I wanted an >> interactive GUI terminal in Racket, what's the best way to do it? > > > Another thing you can look at is my Rackterm package[1]. It is currently an > undocumented mess (and the first Racket project I made over a couple hundred > lines), but it is also a reasonably compliant xterm that handles > colors/styles, curses applications (eg. emacs and vim work fine in it), etc. > I've always intended to clean up the parser and make it available as a > library for applications that want to parse and use input with ANSI control > characters in it, make the various pieces available as stable interfaces for > embedding terminals into applications, etc. I haven't gotten around to > doing that, but there is an unstable terminal-canvas.rkt that provides the > terminal gui widget. > > [1] https://github.com/willghatch/rackterm > > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to racket-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[racket-users] Re: New package: Argo: JSON Schema validation
This is quite a timely post. I had been looking into using a JSON schema validation C library and using FFI to hook into that for my projects. I'll give your new package a try! Thank you for making it available Jesse. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] GUI for ffmpeg and mrlib/terminal
On Wed, Aug 30, 2017 at 09:57:01AM -0400, David Storrs wrote: Still, I'm also interested in the original question: if I wanted an interactive GUI terminal in Racket, what's the best way to do it? Another thing you can look at is my Rackterm package[1]. It is currently an undocumented mess (and the first Racket project I made over a couple hundred lines), but it is also a reasonably compliant xterm that handles colors/styles, curses applications (eg. emacs and vim work fine in it), etc. I've always intended to clean up the parser and make it available as a library for applications that want to parse and use input with ANSI control characters in it, make the various pieces available as stable interfaces for embedding terminals into applications, etc. I haven't gotten around to doing that, but there is an unstable terminal-canvas.rkt that provides the terminal gui widget. [1] https://github.com/willghatch/rackterm -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Need help improving a macro
> I would love to see some library provide better abstractions for > fairly common cases of keywords like this Honestly, I don't think I need a library, I need better knowledge. Your macro works, but I have no idea how I could have come up with it. The Racket guide gives a good introduction to the language, but when it comes to the macro system which is basically a language on its own, all I get is one chapter in the the guide and a huge reference manual. How did other people learn Racket meta programming? Read the implementation? I feel like I have opened a box full of electronics parts and all parts are labeled and documented perfectly, but I have no idea what any of those labels mean. It looks like your macro is turning strings into symbols. I changed (define-syntax (register-nvim-function! stx) (displayln stx) #`(begin)) into (define-syntax (register-nvim-function! stx) (displayln (syntax->datum stx)) #`(begin)) so that it would print the list-representation of what it got, and all the strings are symbols: > (define-nvim-function (foo bar baz) #:name "_foo" #:eval (void) #:sync "hello" (display bar) (display baz)) (register-nvim-function! foo _foo #:eval (void) #:sync hello) This is not much of an issue since symbols are packed into strings, but it is a weak spot. > You would probably then want to add contracts using `expr/c`. Yes, once I can wrap my head around how the macro works I can harden it. > I also wonder if you really want to have a mandatory "name" argument > or if you should infer it based on the identifier being defined > (perhaps with an option to override). I was considering that, but the Racket conventions for function names (lower-case, using hyphens) are not valid Neovim function names. The user would either have to use un-Racketey names in Racket code or specify the name any time, so I might as well make the name mandatory. > here is how I might write this: Let me see if I understand how your macro works. (define-splicing-syntax-class options #:attributes (name [opt 1]) (pattern (~seq (~alt (~once (~seq #:name name:expr)) (~optional (~seq #:range range:expr)) (~optional (~seq #:eval eval:expr)) (~optional (~seq #:sync sync?:expr))) ...) #:with (opt ...) #`(#,@(for*/list ([clause (in-list (list (attr? #:range range) (attr? #:eval eval) (attr? #:sync sync?)))] #:when clause [term (in-list clause)]) term This is the syntax class of all the keyword-value pairs. My first mistake was using `~alt`, I should have used `(~seq (~alt ...))` instead because I accept a sequence of pairs, not just one pair. The syntax class also matches all the pair at once instead of each class instance matching only one pair. The `#:with` directive mathes the `opt ...` pattern against a syntax object which has been constructed out of all the non-name pairs. But how does the `name` attribute get its value? Because it's not an `opt`? (syntax-parse stx [(_ raw-lhs:expr opts:options body:expr ...+) The `raw-lhs` is the thing we want defined. How does it know to match both `foo` and `(foo bar baz)`? #:do [(define-values (ident-stx rhs-stx) (normalize-definition #'(define raw-lhs body ...) #'λ #t #t))] I don't understand why we need this. It takes apart a definition we built on the fly, takes it apart, but in the template we put thing back together in the same order: #'(begin (define ident rhs) (register-function! ident opts.name opts.opt ...))])) -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] GUI for ffmpeg and mrlib/terminal
James wrote on 08/29/2017 03:57 PM: I have been working through The Racket Graphical Interface Toolkit documentation to learn GUI programming and I thought I would do a small but useful project. The idea is to make a simple GUI front end which will formulate commands for ffmpeg to do various video and audio conversions on selected files and then run those commands. James, this is a great idea GUI learning exercise (and coincidentally I did a very similar thing for one of my first GUI programs, for a different technical command line program with lots of complicated options). I think you should do this. Considering that "ffmpeg" is normally non-interactive, you don't necessarily need full terminal functionality. You just need something like Racket `subprocess` or `process*/ports`, and to write I/O-ish code to monitor the stdout and stderr output, and do appropriate GUI things. Specifically, you might want to do a few things with the stdout/stderr output: * Store some raw form of it (space-limited, like ring buffer), in case user selects to show this in a GUI text viewer, or display it as ffmpeg runs. * Monitor it for error messages (you can use regexps), and present them in a GUI-friendly way. * Monitor it for progress information, and turn that into a GUI progress bar or similar, since ffmpeg can take minutes or hours to run. There's also some UI design challenges here. At first, you might want to translate a bunch of command line arguments into GUI elements. After doing some of it manually, you might also look at making it data-driven (e.g., you come up with a minilanguage representing pertinent semantics of the ffmpeg command line options, and then write code that translates that to appropriate GUI elements. Before/after that you might want to look at things like saving configurations (minilanguage helps here), and providing higher-level "task" interfaces. (Say, a task is to convert various video file formats to 1080/60p in a particular container and codec profile, preserving aspect ratio. And maybe you can figure out how to remove letterboxing black bars automatically from the original videos.) I threw out a few ideas for where you might take this, for later reference, but the thing to do is to just sit down in front of a DrRacket, and start building up code to handle the process and/or create the GUI elements. At some point, you can come back to people's comments and decide where you want to go next. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] GUI for ffmpeg and mrlib/terminal
That is very cool, Leif. Still, I'm also interested in the original question: if I wanted an interactive GUI terminal in Racket, what's the best way to do it? On Tue, Aug 29, 2017 at 7:40 PM, Leif Andersen wrote: > Well James, you're in luck. > > The short answer is, yes, yes you can. You should check out video at > http://lang.video (you can follow the progress either on the blog, the > twitter feed http://twitter.com/videolang , or on github itself: > https://github.com/videolang/video . Alternatively, you are welcome to > arrange a call with me some time so we can coordinate our efforts. > > > The (slightly) longer answer is: you can find the (private and thus > unstable) bindings here: > https://github.com/videolang/video/tree/master/video/private/ffmpeg; > and my (very early) prototype NLVE widgets here: > https://github.com/videolang/video/blob/master/video/private/editor.rkt. > In either case, contributions are absolutely welcome. Bug reports are > also welcome and very helpful. > > I hope that helps, and feel free to ask any questions. If you are > interested in creating GUIs for Video editing we should also sit down > for a chat some time. (Either in person or via teleconference.) > > Anyway, I hope you have a lovely day. > > ~Leif Andersen > > > On Tue, Aug 29, 2017 at 3:57 PM, James wrote: > > I have been working through The Racket Graphical Interface Toolkit > documentation to learn GUI programming and I thought I would do a small but > useful project. The idea is to make a simple GUI front end which will > formulate commands for ffmpeg to do various video and audio conversions on > selected files and then run those commands. MrLib/terminal seems like just > the thing except there are various ways that it isn't as good as it could > be for this kind of project. It's mostly small things, for example, the > cancel button is labeled "Abort Instillation" by default. The one thing > which is not so simple is that it looks like it is intended to just run one > command and not create an interactive environment. I was expecting to be > able to send commands to the terminal% object in order to run things one > after another. Instead, you pass a function as a parameter when you create > the terminal% object and it just runs that function. So, either I have to > close the terminal and open a new one each time I run a command or I > suppose that I could have the function work with a thread mailbox or > channels so that I could keep using it. My question is whether MrLib > Terminal the best option for this kind of work or is there a better bet? > > > > https://docs.racket-lang.org/mrlib/Terminal_Window.html > > > > James > > > > -- > > You received this message because you are subscribed to the Google > Groups "Racket Users" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to racket-users+unsubscr...@googlegroups.com. > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to racket-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.