metaprogramming haskell metaprogramming haskell
play

Metaprogramming Haskell, Metaprogramming Haskell, Metaprogramming - PowerPoint PPT Presentation

Metaprogramming Haskell, Metaprogramming Haskell, Metaprogramming Haskell, The Racket Way The Racket Way The Racket Way Alexis King Alexis King Northwestern University & PLT 1 #!/bin/bash set -ueo pipefail curl -s


  1. Metaprogramming Haskell, Metaprogramming Haskell, Metaprogramming Haskell, The Racket Way The Racket Way The Racket Way Alexis King Alexis King Northwestern University & PLT 1

  2. #!/bin/bash set -ueo pipefail curl -s http://data-source.com/api/data.json \ | jq '.[] | { name: payload.name }' \ | python3 data-processor.py ���

  3. #!/bin/bash set -ueo pipefail prefix_lines () { sed -e "s/^/$1: /" } with_prefix_outerr () { mk_pipe err_out err_in { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- prefix_lines stderr <&$err_in- } curl -s http://data-source.com/api/data.json \ | jq '.[] | { name: payload.name }' \ | with_prefix_outerr python3 data-processor.py \ |& tee all-output.log \ | grep -F '[info]' 4

  4. import io, os, sys, threading from subprocess import Popen, PIPE def prefix_lines(prefix, unprefixed_in, prefixed_out): def do_prefix_lines(): for line in unprefixed_in: prefixed_line = prefix + ': ' + line prefixed_out.write(prefixed_line) t = threading.Thread(target=do_prefix_lines, daemon=True) t.start() return t def prefix_outerr(unprefixed_out, unprefixed_err, prefixed_out, prefixed_err): t_out = prefix_lines('stdout', unprefixed_out, prefixed_out) t_err = prefix_lines('stderr', unprefixed_err, prefixed_err) return t_out, t_err if __name__ == '__main__': curl = Popen(['curl', '-s', 'http://data-source.com/api/data.json'], stdout=PIPE) jq = Popen(['jq', '.[] | { name: payload.name }', stdin=curl.stdout, stdout=PIPE]) with Pipe() as data_out, Pipe() as data_err: processor = threading.Thread( target=data_processor, args=(jq.stdout, data_out.output, data_err.output), daemon=True) processor.start() with Pipe() as prefixed_data: t_out, t_err = prefix_outerr(data_out.input, data_err.input, prefixed_data.output, prefixed_data.output) do_on_finish([t_out, t_err], lambda: prefixed_data.output.close()) tee = Popen(['tee', 'all-output.log'], stdin=prefixed_data.input, stdout=PIPE) grep = Popen(['grep', '-F', '[info]'], stdin=tee.stdout, stdout=sys.stdout) sys.exit(grep.wait()) 5

  5. import io, os, sys, threading from subprocess import Popen, PIPE def prefix_lines(prefix, unprefixed_in, prefixed_out): def do_prefix_lines(): for line in unprefixed_in: prefixed_line = prefix + ': ' + line prefixed_out.write(prefixed_line) t = threading.Thread(target=do_prefix_lines, daemon=True) #!/bin/bash t.start() set -ueo pipefail return t prefix_lines () { def prefix_outerr(unprefixed_out, unprefixed_err, sed -e "s/^/$1: /" prefixed_out, prefixed_err): } t_out = prefix_lines('stdout', unprefixed_out, prefixed_out) with_prefix_outerr () { t_err = prefix_lines('stderr', unprefixed_err, prefixed_err) mk_pipe err_out err_in return t_out, t_err { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- prefix_lines stderr <&$err_in- if __name__ == '__main__': } curl = Popen(['curl', '-s', 'http://data-source.com/api/data.json'], stdout=PIPE) jq = Popen(['jq', '.[] | { name: payload.name }', stdin=curl.stdout, stdout=PIPE]) curl -s http://data-source.com/api/data.json \ | jq '.[] | { name: payload.name }' \ with Pipe() as data_out, Pipe() as data_err: | with_prefix_outerr python3 data-processor.py \ processor = threading.Thread( |& tee all-output.log \ target=data_processor, | grep -F '[info]' args=(jq.stdout, data_out.output, data_err.output), daemon=True) processor.start() with Pipe() as prefixed_data: t_out, t_err = prefix_outerr(data_out.input, data_err.input, prefixed_data.output, prefixed_data.output) do_on_finish([t_out, t_err], lambda: prefixed_data.output.close()) tee = Popen(['tee', 'all-output.log'], stdin=prefixed_data.input, stdout=PIPE) grep = Popen(['grep', '-F', '[info]'], stdin=tee.stdout, stdout=sys.stdout) sys.exit(grep.wait()) 6

  6. with_prefix_outerr () { mk_pipe err_out err_in { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- prefix_lines stderr <&$err_in- } curl -s http://data-source.com/api/data.json \ | jq '.[] | { name: payload.name }' \ | with_prefix_outerr python3 data-processor.py \ |& tee all-output.log \ | grep -F '[info]' 7

  7. with_prefix_outerr () { main.o: main.c defs.h mk_pipe err_out err_in cc -c main.c { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- kbd.o: kbd.c defs.h command.h prefix_lines stderr <&$err_in- cc -c kbd.c } command.o: command.c defs.h command.h cc -c command.c curl -s http://data-source.com/api/data.json \ display.o: display.c defs.h buffer.h | jq '.[] | { name: payload.name }' \ cc -c display.c | with_prefix_outerr python3 data-processor.py \ clean: |& tee all-output.log \ rm edit main.o kbd.o command.o display.o | grep -F '[info]' 8

  8. with_prefix_outerr () { main.o: main.c defs.h mk_pipe err_out err_in cc -c main.c { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- kbd.o: kbd.c defs.h command.h prefix_lines stderr <&$err_in- cc -c kbd.c } command.o: command.c defs.h command.h cc -c command.c curl -s http://data-source.com/api/data.json \ display.o: display.c defs.h buffer.h | jq '.[] | { name: payload.name }' \ cc -c display.c | with_prefix_outerr python3 data-processor.py \ clean: |& tee all-output.log \ rm edit main.o kbd.o command.o display.o | grep -F '[info]' \subsection{Haskell as Macros} \label{sub:hh-core} While Hackett implements most of the Haskell core language, it can shift a number of pieces from the core into programmer-defined libraries. Hackett's kernel language is not theoretical; it is defined as an actual Racket language, i.e., a module that exports syntactic forms and run-time functions (see \texttt{hackett/private/kernel}). The Hackett kernel language consists of just these pieces: \begin{enumerate} \item the core typechecker and core type language, 9

  9. with_prefix_outerr () { main.o: main.c defs.h mk_pipe err_out err_in cc -c main.c { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- kbd.o: kbd.c defs.h command.h prefix_lines stderr <&$err_in- cc -c kbd.c } command.o: command.c defs.h command.h cc -c command.c curl -s http://data-source.com/api/data.json \ display.o: display.c defs.h buffer.h | jq '.[] | { name: payload.name }' \ cc -c display.c | with_prefix_outerr python3 data-processor.py \ clean: |& tee all-output.log \ rm edit main.o kbd.o command.o display.o | grep -F '[info]' \subsection{Haskell as Macros} \label{sub:hh-core} server { listen 80; While Hackett implements most of the Haskell core language, access_log logs/domain1.access.log main; it can shift a number of pieces from the core into root html; programmer-defined libraries. Hackett's kernel language is not theoretical; it is defined as an actual Racket language, i.e., a module that exports syntactic forms and run-time location ~ \.php$ { functions (see \texttt{hackett/private/kernel}). fastcgi_pass 127.0.0.1:1025; The Hackett kernel language consists of just these pieces: } \begin{enumerate} } \item the core typechecker and core type language, 1 �

  10. #lang rash with_prefix_outerr () { main.o: main.c defs.h mk_pipe err_out err_in cc -c main.c { "$@" 2>&3- | prefix_lines stdout & } 3>&$err_out- kbd.o: kbd.c defs.h command.h (define-syntax-rule (with-prefix-out+err block) prefix_lines stderr <&$err_in- cc -c kbd.c (seq { } |& #:with [pipe] seq { command.o: command.c defs.h command.h |& seq block |&> prefix-lines "stdout" err> pipe-out &bg cc -c command.c |&> prefix-lines "stderr" in< pipe-in out> &err } })) curl -s http://data-source.com/api/data.json \ display.o: display.c defs.h buffer.h | jq '.[] | { name: payload.name }' \ curl -s http://data-source.com/api/data.json \ cc -c display.c | with_prefix_outerr python3 data-processor.py \ | jq ".[] | { name: payload.name }" \ clean: |& with-prefix-out+err { python3 data-processor.py } \ |& tee all-output.log \ | tee all-output.log \ rm edit main.o kbd.o command.o display.o | grep -F '[info]' | grep -F "[info]" \subsection{Haskell as Macros} \label{sub:hh-core} server { listen 80; While Hackett implements most of the Haskell core language, access_log logs/domain1.access.log main; it can shift a number of pieces from the core into root html; programmer-defined libraries. Hackett's kernel language is not theoretical; it is defined as an actual Racket language, i.e., a module that exports syntactic forms and run-time location ~ \.php$ { functions (see \texttt{hackett/private/kernel}). fastcgi_pass 127.0.0.1:1025; The Hackett kernel language consists of just these pieces: } \begin{enumerate} } \item the core typechecker and core type language, 11

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend