krismicinski
2018-7-26 09:36:38

we submitted to scheme workshop and if our paper gets in I’ll probably go :smiley:


krismicinski
2018-7-26 09:36:52

my student will be going too, and I think he’ll probably want someone to split a room with


krismicinski
2018-7-26 09:42:08

the conference is not very harmoniously planned with my teaching schedule, though :confused:. Don’t really want to miss four courses. Will probably compromise by doing two remote if I go


pocmatos
2018-7-26 09:45:15

To the math inclined people, what’s the best way to draw an element from a uniform distribution table: #hasheq((a . 0.5) (b . 0.16) (c . 0.2))? Note the table is not normalize. I can easily do that with a loop to get #hasheq((a . 0.58) (b . 0.19) (c . 0.23)), but then I would probably compute the choice borders for 1 as a list, and get '((a . 0.58) (b . 0.77) (c . 1)). After this I do a (random) and loop the list until I find a cdr larger than my random value, returning then the car. This looks quite complex for what looks to be a simple thing to do. Also, there might be a library out there doing things the right way. Any suggestions?


pocmatos
2018-7-26 10:07:19

So, I have taken the above approach to write this horrific piece of code: (define distribution #hasheq((a . 0.5) (b . 0.16) (c . 0.2))) (define sum (for/fold ([total 0]) ([(_ v) (in-hash distribution)]) (+ total v))) (define normalized (for/hasheq ([(k v) (in-hash distribution)]) (values k (/ v sum)))) (define choice-edges (for/fold ([total 0] [l '()] #:result (reverse l)) ([p (in-list (sort (hash->list normalized) < #:key cdr))]) (define k (car p)) (define v (cdr p)) (define accum (+ total v)) (values accum (cons (cons k accum) l)))) (define (random-in-distribution) (define v (random)) (let loop ([edges choice-edges]) (define edge (car edges)) (if (< v (cdr edge)) (car edge) (loop (cdr edges)))))


pocmatos
2018-7-26 10:08:58

Suggestions on how to improve this are welcome. There are so many loops that it feels really inefficient, however most of those could be done once since the distribution in my case is static. The bigger problem is that the function generating the values, requires looping through the choice-edges list.


pocmatos
2018-7-26 10:30:48

So, I revised this to generate a table so that I only need a vector-ref for the random choice: (define normalize-100 (for/hasheq ([(k v) (in-hash distribution)]) (values k (inexact->exact (round (/ (* v 100) sum)))))) (require mischief/for) (define choice-table (list->vector (for/append (((k v) (in-hash normalize-100))) (make-list v k)))) (define sz (vector-length choice-table)) ;; not necessarily 100 (define (random-in-choice-table) (define v (random sz)) (vector-ref choice-table v))


pocmatos
2018-7-26 10:31:04

Better but not great. I welcome any comments on this.


soegaard2
2018-7-26 10:35:33

You can use discrete-dist to make a finite distribution with your weights. Then use sample to generate random samples.


maxim_jaffe
2018-7-26 11:21:59

Hello, can someone help me out getting unit testing working


maxim_jaffe
2018-7-26 11:22:48

This is my main script/module


maxim_jaffe
2018-7-26 11:22:57

called ABC.rkt


maxim_jaffe
2018-7-26 11:23:15

then I have ABC_test.rkt in the same folder


maxim_jaffe
2018-7-26 11:23:30

maxim_jaffe
2018-7-26 11:23:41

but I get the following error… ABC.rkt:3:9: ABC.rkt:3:9: cannot open module file module path: math/distribution path: /usr/share/racket/pkgs/math-lib/math/distribution.rkt system error: No such file or directory; errno=2 in: math/distribution no package suggestions are available .


soegaard2
2018-7-26 11:24:27

math/distribution -> math/distributions


maxim_jaffe
2018-7-26 11:25:10

ah I hadn’t save the file :stuck_out_tongue:


maxim_jaffe
2018-7-26 11:25:20

the ABC.rkt


soegaard2
2018-7-26 11:25:23

that helps too :slightly_smiling_face:


maxim_jaffe
2018-7-26 11:25:55

I made the change but forgot to save :man-facepalming:


maxim_jaffe
2018-7-26 11:26:01

but thanks anyways


maxim_jaffe
2018-7-26 11:26:08

should pay more attention to the trace


maxim_jaffe
2018-7-26 11:31:17

racket has a quickcheck that’s really cool :slightly_smiling_face:


maxim_jaffe
2018-7-26 11:31:23

do a lot of people use it?


maxim_jaffe
2018-7-26 11:37:09

strange binomial-dist returns a float


maxim_jaffe
2018-7-26 11:37:18

would be nicer that it be a integer


pocmatos
2018-7-26 12:13:21

@soegaard2 thanks. I will take a look at the lib.


soegaard2
2018-7-26 17:16:15

lang racket

(struct foo (name)) (struct colored-foo (color)) (struct sized-foo (size))

(match (sized-foo ’xl) [(colored-foo n) ’colored] ; <= expected error here! [(sized-foo n) ’sized] [(foo n) n])


soegaard2
2018-7-26 17:16:29

@samth Is this a bug in match?


soegaard2
2018-7-26 17:16:52

The result is ’sized.


soegaard2
2018-7-26 17:17:31

nevermind - forgot foo


maxim_jaffe
2018-7-26 17:46:57

(vector-map sample (normal-dist)) Type Checker: missing type for top-level identifier; either undefined or missing a type annotation identifier: sample in: sample


maxim_jaffe
2018-7-26 17:47:47

Is this supposed to happen..?


maxim_jaffe
2018-7-26 17:48:11

ah wait


maxim_jaffe
2018-7-26 17:48:57

I meant (vector-map sample '#((normal-dist)))


maxim_jaffe
2018-7-26 17:49:01

still get the same error


maxim_jaffe
2018-7-26 17:55:31

(vector-map distribution? (vector (normal-dist)))


maxim_jaffe
2018-7-26 17:55:34

this works


maxim_jaffe
2018-7-26 17:55:47

(vector-map sample (vector (normal-dist))) this doesn’t


maxim_jaffe
2018-7-26 17:56:24

any idea why..?


ben
2018-7-26 18:03:02

I’m not seeing the same error message, but if I run this: #lang typed/racket (require math/distributions) (vector-map sample (vector (normal-dist))) then TR says Type Checker: Polymorphic functionvector-map’ could not be applied to arguments …`


maxim_jaffe
2018-7-26 18:03:29

yeah I am getting that now


ben
2018-7-26 18:03:38

and that usually means the program needs to use inst to replace some type variables


maxim_jaffe
2018-7-26 18:05:20

hum still learning Racket and typed racket


maxim_jaffe
2018-7-26 18:05:57

not sure how to use inst


ben
2018-7-26 18:06:17

(vector-map (inst sample Real Real) (vector (normal-dist))) seems to work


ben
2018-7-26 18:06:26

using inst is hard


ben
2018-7-26 18:06:59

you need to figure out / guess which expressions have polymorphic type, then the number of variables, and finally what to fill them with


samth
2018-7-26 18:08:10

note that the error message tells you the first two things:


samth
2018-7-26 18:08:20
Type Checker: Polymorphic function `vector-map' could not be applied to arguments:
Domain: (-&gt; a b ... b c) (Vectorof a) (Vectorof b) ... b
Arguments: (All (In Out) (case-&gt; (-&gt; (distribution In Out) Out) (-&gt; (distribution In Out) Integer (Listof Out)))) (Vector Normal-Dist)
Result type: (Vectorof c)
Expected result: AnyValues

samth
2018-7-26 18:08:53

you need to instantiate the first argument (it’s the one with the All type) and you need to supply two type arguments (for In and Out)


maxim_jaffe
2018-7-26 18:22:11

ok thanks :slightly_smiling_face:, let’s see if I can learn


maxim_jaffe
2018-7-26 18:22:29

is there any particular doc link that explains how to go about this?


maxim_jaffe
2018-7-26 18:23:50

I don’t quite understand why it’s Real


maxim_jaffe
2018-7-26 18:23:53

in this case


maxim_jaffe
2018-7-26 18:24:31

the double Real I mean


ben
2018-7-26 18:24:43

other numbers might work too


maxim_jaffe
2018-7-26 18:24:54

I understand that the result values within the vector will be Real


maxim_jaffe
2018-7-26 18:26:58

hum (inst sample Real) works


maxim_jaffe
2018-7-26 18:27:07

so I don’t need the extra Real?


ben
2018-7-26 18:28:58

I guess TR is able to figure out the result, when inferring a type for this application of vector-map


maxim_jaffe
2018-7-26 18:32:44

This is confusing (vector-map (inst sample Real Real) (vector (bernoulli-dist 1.0)))


maxim_jaffe
2018-7-26 18:32:49

This works fine


maxim_jaffe
2018-7-26 18:33:14

But then this doesn’t (vector-map (inst sample Real Real) (vector (bernoulli-dist 1.0) (normal-dist)))


maxim_jaffe
2018-7-26 18:33:19

…??


ben
2018-7-26 18:34:35

what does the error message say?


samth
2018-7-26 18:35:24

@maxim_jaffe it supplies a default type if you don’t provide all of them


maxim_jaffe
2018-7-26 18:36:05

Type Checker: Polymorphic function `vector-map' could not be applied to arguments: Domain: (-&gt; a b ... b c) (Vectorof a) (Vectorof b) ... b Arguments: (case-&gt; (-&gt; (distribution Real Real) Real) (-&gt; (distribution Real Real) Integer (Listof Real))) (Vector Bernoulli-Dist Normal-Dist) in: (vector-map (inst sample Real Real) (vector (bernoulli-dist 1.0) (normal-dist)))


maxim_jaffe
2018-7-26 18:36:57

you mean I have to supply for distributionin the vector..? Or..?


maxim_jaffe
2018-7-26 18:39:42

I get the general idea ut don’t understand the specifics and the trace message is confusing me


maxim_jaffe
2018-7-26 18:40:32

Is this explained in detail in the Typed Racket Guide or Reference? I just looked at the basics to be honest


ben
2018-7-26 18:41:05

hm, I think this is because the default type for the vector is too specific for map


ben
2018-7-26 18:41:12

because this works: #lang typed/racket (require math/distributions) (define v : (Vectorof (U Normal-Dist Bernoulli-Dist)) (vector (bernoulli-dist 1.0) (normal-dist))) (vector-map (inst sample Real Real) v)


maxim_jaffe
2018-7-26 18:42:02

but what if I want to use any distribution…


ben
2018-7-26 18:42:15

is there a supertype of all distributions?


maxim_jaffe
2018-7-26 18:42:25

think its just called distribution



ben
2018-7-26 18:44:35

hm, it also works to avoid using vector: #lang typed/racket (require math/distributions) (define v (list-&gt;vector (list (bernoulli-dist 1.0) (normal-dist)))) (vector-map (inst sample Real Real) v)


maxim_jaffe
2018-7-26 18:44:56

> (distribution? (normal-dist)) - : Boolean [more precisely: True] #t


ben
2018-7-26 18:45:21

(vector is trying to infer a Vector type when possible, instead of a Vectorof type)


maxim_jaffe
2018-7-26 18:45:40

what..


maxim_jaffe
2018-7-26 18:45:56

is there a constructor for Vectorof


lexi.lambda
2018-7-26 18:46:23

Vectorof is a type, not a value


lexi.lambda
2018-7-26 18:47:33

there are two types for vectors, Vector and Vectorof. the former is a type like a tuple: (Vector Integer String Boolean) describes a vector with exactly 3 elements, the first of which is an integer, the second of which is a string, and the third of which is a boolean. Vectorof only takes one type argument, and it describes a vector of arbitrary length that only contains one type of element.


lexi.lambda
2018-7-26 18:47:52

this is kind of confusing, but it’s done because untyped racket uses lists and vectors in both ways.


lexi.lambda
2018-7-26 18:48:47

Also, the type names correspond to the related contract names in untyped racket, which are named vector/c and vectorof, respectively.


maxim_jaffe
2018-7-26 18:49:35

Well I am basically looking at a vector of a single type (sort like an array in other languages) not really interested in a tuple


maxim_jaffe
2018-7-26 18:49:44

(map (inst sample Real Real) (list (bernoulli-dist) (normal-dist)))


maxim_jaffe
2018-7-26 18:50:01

this seems to work ok


ben
2018-7-26 18:50:27

and that’s because lists are immutable


maxim_jaffe
2018-7-26 18:50:35

Works with different sizes (map (inst sample Real Real) (list (bernoulli-dist) (normal-dist) (poisson-dist)))


maxim_jaffe
2018-7-26 18:50:45

vector are mutable?


maxim_jaffe
2018-7-26 18:50:51

ah didn’t realise that


ben
2018-7-26 18:51:08

well there’s 2 kinds of vectors but usually they’re mutable


maxim_jaffe
2018-7-26 18:51:17

I don’t need to mutable data structure


ben
2018-7-26 18:51:19

(vector …) is mutable, '#( ... ) is immutable


maxim_jaffe
2018-7-26 18:51:29

hum ok


maxim_jaffe
2018-7-26 18:51:42

didn’t understand it was different


ben
2018-7-26 18:51:51

I should have said (vector-immutable ...) above


maxim_jaffe
2018-7-26 18:53:26

Ok so my basic reasoning is I just want to process a fixed length data structure the fastest


maxim_jaffe
2018-7-26 18:53:41

from what I read I thought I would be better of with immutable vector


maxim_jaffe
2018-7-26 18:53:53

should I just stick to lists instead?


maxim_jaffe
2018-7-26 18:54:19

I just need to take a bunch of distributions and sample from them


maxim_jaffe
2018-7-26 18:54:33

for Approximate Bayesian Computation (ABC)


maxim_jaffe
2018-7-26 18:55:23

say 1000 or 10 000 samples (possible in each nth iteration)


maxim_jaffe
2018-7-26 18:56:20

I have some functions in regular racket


maxim_jaffe
2018-7-26 18:56:21

working


maxim_jaffe
2018-7-26 18:56:32

just wanted to change it to typed racket for th performance gains


ben
2018-7-26 18:57:21

if you want fast random access to a structure, vectors are better


ben
2018-7-26 18:57:52

people should be around here & on the mailing list to help with the type errors


maxim_jaffe
2018-7-26 18:59:17

well you guys @ben @samth and @lexi.lambda have already help quite a bit :slightly_smiling_face: thanks


maxim_jaffe
2018-7-26 18:59:46

is #general the best channel for these questions?


maxim_jaffe
2018-7-26 19:04:49

Ok so I changed to functions to work with lists (at least for now). But I get another error


maxim_jaffe
2018-7-26 19:05:05

. Type Checker: No function domains matched in function application: Types: Real Real Real -&gt; (Sequenceof Real) Real Real -&gt; (Sequenceof Real) Real -&gt; (Sequenceof Nonnegative-Integer) Arguments: Zero (U Exact-Complex Exact-Imaginary Float-Imaginary Inexact-Complex Single-Flonum-Imaginary) One Expected result: AnyValues in: (for/list ((i (range n))) (prior-sample priors))


maxim_jaffe
2018-7-26 19:06:06

hum think I figured it out


maxim_jaffe
2018-7-26 19:06:20

(: prior-samples (-&gt; Real (Listof distribution) (Listof (Listof Real))))


maxim_jaffe
2018-7-26 19:13:46

Type Checker: type mismatch expected: (Listof distribution) given: (List Bernoulli-Dist) in: (list (bernoulli-dist 0.0))


maxim_jaffe
2018-7-26 19:14:15

hum so the same issue between List and Listof ?


pnwamk
2018-7-26 19:16:02

I was tinkering a little, it didn’t seem to me that Bernoulli-Dist was a subtype of distribution


pnwamk
2018-7-26 19:17:09
#lang typed/racket

(require math/distributions)

(ann (bernoulli-dist 0.0) distribution)

;;Type Checker: type mismatch
;;  expected: distribution
;;  given: Bernoulli-Dist in: (bernoulli-dist 0.0)

maxim_jaffe
2018-7-26 19:17:46

strange, but with this test, it returns #t &gt; (distribution? (bernoulli-dist)) - : Boolean [more precisely: True] #t


maxim_jaffe
2018-7-26 19:18:08

shouldn’t it match?


pnwamk
2018-7-26 19:18:16

I don’t know — I agree that is odd


maxim_jaffe
2018-7-26 19:18:19

by the way how do I generate a type Listof


maxim_jaffe
2018-7-26 19:18:27

..?


pnwamk
2018-7-26 19:18:38

List vs Listof wasn’t the problem in the last error message


pnwamk
2018-7-26 19:19:01

(List A ...) is a subtype of (Listof B) so long as A is a subtype of B


maxim_jaffe
2018-7-26 19:19:25

hum ok!


maxim_jaffe
2018-7-26 19:20:16

so ann is used to check if it is a certain subtype


maxim_jaffe
2018-7-26 19:20:25

type or subtype


maxim_jaffe
2018-7-26 19:21:02

is there someway of getting the “inheritance” or something like that of the type


maxim_jaffe
2018-7-26 19:21:18

so you know to which subtypes it belongs?


pnwamk
2018-7-26 19:23:05

ann is just a type annotation. It tells the type checker “I expect it to be this type”, which sometimes helps terms type check that otherwise would not, and other times it can serve to confirm to the programmer a term is of the type they thought it was


pnwamk
2018-7-26 19:23:29

I don’t think there’s a nice way to explore the “inheritance tree” of types directly…


maxim_jaffe
2018-7-26 19:23:44

ok sort of like type or isinstance in Python?


maxim_jaffe
2018-7-26 19:23:55

hum ok


maxim_jaffe
2018-7-26 19:24:06

maybe I should ready the guide more carefully


maxim_jaffe
2018-7-26 19:24:12

the TR guide


pnwamk
2018-7-26 19:24:16

but ann doesn’t do anything at runtime


pnwamk
2018-7-26 19:24:21

it’s just for the type checker (and programmer xD)


pnwamk
2018-7-26 19:27:52

@maxim_jaffe I’m not at all familiar with the “distribution” portion of the math library, but in peeking at the code, it seems indeed Bernoulli-Dist should be a subtype of distribution. I’ll submit an issue on the github repo.


maxim_jaffe
2018-7-26 19:29:19

seems to be even more general problem


maxim_jaffe
2018-7-26 19:29:45

(ann (normal-dist) distribution) . Type Checker: type mismatch expected: distribution given: Normal-Dist in: (normal-dist)


maxim_jaffe
2018-7-26 19:30:03

&gt; (ann (binomial-dist) distribution) . Type Checker: type mismatch expected: distribution given: Binomial-Dist in: (binomial-dist)


maxim_jaffe
2018-7-26 19:30:28

&gt; (ann (poisson-dist) distribution) . Type Checker: type mismatch expected: distribution given: Poisson-Dist in: (poisson-dist)


pnwamk
2018-7-26 19:31:51

hmm… perhaps there’s some more obvious reason it doesn’t work then? (or maybe it’s just a big glaring omission no one has stumbled upon until now? like I said, I’m not at all familiar with this code)


maxim_jaffe
2018-7-26 19:32:04

yeah I find it odd



pnwamk
2018-7-26 19:34:19

aha!


pnwamk
2018-7-26 19:34:24
#lang typed/racket

(require math/distributions)

(ann (bernoulli-dist 0.0) (distribution Real Real))

maxim_jaffe
2018-7-26 19:34:41

hehe ok?


maxim_jaffe
2018-7-26 19:35:19

&gt; (ann (poisson-dist) (distribution Real Real)) - : (distribution Real Real) (poisson-dist 0.5)


maxim_jaffe
2018-7-26 19:35:23

seems to work


maxim_jaffe
2018-7-26 19:35:33

so in the function what type annotation should I put


maxim_jaffe
2018-7-26 19:35:43

maxim_jaffe
2018-7-26 19:36:06

(Listof distribution Real Real) ..?


pnwamk
2018-7-26 19:36:38

methinks (-&gt; (Listof (distribution Real Real)) (Listof Real)))


maxim_jaffe
2018-7-26 19:37:09

cool thanks that works


maxim_jaffe
2018-7-26 19:37:17

so let me get this right


maxim_jaffe
2018-7-26 19:37:27

I don’t know CS deeply


maxim_jaffe
2018-7-26 19:37:41

but distribution type is polymorphic..? or something


pnwamk
2018-7-26 19:38:51

yes


pnwamk
2018-7-26 19:39:06
(struct: (In Out) distribution ([pdf : (PDF In)]
                                [sample : (Sample Out)])
  #:transparent)

pnwamk
2018-7-26 19:39:32

distributions are parameterized by an In and Out type


maxim_jaffe
2018-7-26 19:39:47

hum ok


maxim_jaffe
2018-7-26 19:39:57

guess I have to study some more hehe :wink:


maxim_jaffe
2018-7-26 19:40:04

but seems to working now


pnwamk
2018-7-26 19:41:27

I think the docs here should probably be more clear about the distribution (and other such) type: https://docs.racket-lang.org/math/Distribution_Types_and_Operations.html?q=bernoulli-dist


maxim_jaffe
2018-7-26 19:43:10

to be honest I didn’t read the whole docs I just went in intuition


maxim_jaffe
2018-7-26 19:43:22

but I did lookup distribution


maxim_jaffe
2018-7-26 19:43:41

but I didn’t understand at the time what In and Out was


maxim_jaffe
2018-7-26 19:44:22

thanks for the help @pnwamk this is great


maxim_jaffe
2018-7-26 19:45:06

was afraid I wouldn’t be able to use Typed Racket (which without the speed gains would maybe make my application to slow to work with in regular Racket)


maxim_jaffe
2018-7-26 19:45:33

Small but helpful community you’ve got :slightly_smiling_face:


pnwamk
2018-7-26 19:45:44

I submitted an issue, FYI: https://github.com/racket/math/issues/18


maxim_jaffe
2018-7-26 19:47:27

I got to say even in it’s problems Racket is interesting


maxim_jaffe
2018-7-26 19:47:28

hehe


pnwamk
2018-7-26 19:47:37

xD


maxim_jaffe
2018-7-26 19:48:13

I spent sometime learning Julia, the problems were not at all easy to grasp or to appreciate


maxim_jaffe
2018-7-26 19:49:19

anyway will try and go over the Typed Racket Guide with more care


maxim_jaffe
2018-7-26 19:49:35

but it’s great to have someone to talk to when you hit a wall


maxim_jaffe
2018-7-26 19:50:07

It’s something I never really experienced as a Python programmer, you mostly just find stuff in stackoverflow


maxim_jaffe
2018-7-26 19:50:39

First time I started going into chat rooms was when I started learning languages besides Python


krystal.maughan
2018-7-26 20:04:29

I liked the little bit of Julia I learned. Don’t have time to learn it right now, but very interesting language :slightly_smiling_face:


krystal.maughan
2018-7-26 20:05:10

They’re also always looking for ppl to work on their compiler, if people are interested in that stuff (like an internship over summer, etc)


liamschumm
2018-7-26 20:17:46

@liamschumm has joined the channel


greg
2018-7-26 20:34:41

Stackoverflow can be OK for Racket questions, except certain times of year it gets depressing because so many people are looking for someone to do their Scheme or Racket homework. Then it’s a lot of (cond( (car l) (cdr l) ) (else( null?( cadr l ) ) ) ) :cry:


leif
2018-7-26 20:38:10

There is that…. :disappointed: I mean, I can handle (begrudgingly)

(define (foo x)
  (if blah
     (this that)
     (the other thing)
  )
)

leif
2018-7-26 20:38:37

But they can’t even manage something like that. :cry:


soegaard2
2018-7-26 20:39:30

Probably means they haven’t found DrRacket/racket-mode yet.


soegaard2
2018-7-26 20:40:02

Try writing Racket/Scheme in a standard editor without paren-highlighting and automatic indentation.


leif
2018-7-26 20:40:26

I have…..when I answer their SO questions.


leif
2018-7-26 20:40:32

But ya, they probably haven’t found it yet.


leif
2018-7-26 20:40:53

(But I frequently just write the samples in the SO editor, because I’m lazy like that.)


leif
2018-7-26 20:41:24

BTW, @robby, is the background expander found in drracket/private/expanding-place?


leif
2018-7-26 20:41:32

(Or is there somewhere else I should look for it.)


robby
2018-7-26 20:46:40

that’s part of it, yes.


leif
2018-7-26 20:48:28

Okay. I’m looking to emulate it to do other things in DrRacket, where would you recommend I start looking?


plotnus
2018-7-26 23:53:23

Is there a way to extract all the lexical information from a syntax object and pass that around? I may be wrong but I think the lexical information would contain things like file, line, column, etc. I want to pass this information along. So, is there a way to bind that information in, a let block or something similar?


greg
2018-7-27 00:22:08

@plotnus You can get the source/location using these functions: https://docs.racket-lang.org/reference/stxops.html#(def._((quote._~23~25kernel)._syntax-source))


greg
2018-7-27 00:31:13

More about how Racket represents syntax (including what I think of as “lexical” info or scopes): https://www.cs.utah.edu/plt/scope-sets/index.html


plotnus
2018-7-27 01:25:10

@greg thanks I’ll check that out


plotnus
2018-7-27 01:48:55

btw just realized that you’re the one that wrote “Fear of Macros” Thank you for writing that!


greg
2018-7-27 01:55:11

You’re welcome!


andreiformiga
2018-7-27 02:09:39

thanks