{"action":"created","comment":{"url":"https://api.github.com/repos/pattersongp/plt-f18/pulls/comments/228760215","pull_request_review_id":169103122,"id":228760215,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyODc2MDIxNQ==","diff_hunk":"@@ -0,0 +1,420 @@\n+# File Input Reinterpretation Engine - (FIRE) - Language Reference Manual\n+\n+\n+Graham Patterson (gpp2109)  \n+Frank Spano (fas2154)  \n+Ayer Chan (oc2237)  \n+Christopher Thomas (cpt2132)   \n+Jason Konikow (jk4057)  \n+\n+## Table of contents\n+\n+1. Introduction\n+2. Lexical Conventions\n+3. Meaning of Identifiers\n+4. Expressions\n+5. Statements \n+6. Statements\n+7. Code Sample\n+\n+\n+## 1: Introduction\n+\n+File Input Reinterpretation Engine (FIRE) is a scripting language inspired by AWK, bash, and other syntacically light languages. These languages are renowed for their ability to robustly extract, pattern-match, and manipulate text files. FIRE seeks to emulate this functionality with a more attractive, C-Family inspired syntax and intuitive semantics.\n+\n+FIRE is intended to be utilized with large sets of delimited data, like `csv` files. FIRE is also animated by the premise that files are first class citizens. \n+\n+FIRE was built by a team of Columbia University undergraduates for Professor Stephen Edward's Programming Language and Translators course. FIRE is written in OCaml , utilizing libraries built in `C`, and leveraging the `LLVM` compiler back-end.\n+\n+## 2: Lexical Conventions \n+\n+#### 2.1 Strings\n+\n+Strings are sequences of characters surrounded by double quotes `\"`.\n+As string has the type `str`.\n+\n+#### 2.2 Identifiers\n+\n+Identifiers are a sequence of characters consisting of uppercase or lowercase letters, digits, underscores \n+or dashes. \n+\n+#### 2.3 Keywords\n+\n+The following identifiers are restricted from use:\n+\n+* `int`\n+* `str`\n+* `regx`\n+* `if`\n+* `else`\n+* `elif`\n+* `else`\n+* `for`\n+* `while`\n+* `break`\n+* `return`\n+* `func`\n+* `array`\n+* `file`\n+* `print`\n+* `return`\n+* `map`\n+* `filter`\n+* `true`\n+* `false`\n+* `null`\n+* `void`\n+\n+\n+#### 2.5 Regular Expressions\n+\n+Regular expressions are a special sequence of characters used for pattern matching surounded by single quotes `'` and preceded by the keyword `r'`. Regular expressions are of type `regx`.   \n+\n+#### 2.6 Comments\n+\n+FIRE only supports the use the block comments. Comments are initiated with the `/*` symbol and terminated by the `*/` symbol. Everything in between the symbols will be ignored by FIRE during compilation\n+\n+## 3: Meaning of Identifiers\n+\n+Identifiers are names that correlate to a single value, a function, or an array. The restrictions on valid identifiers are found in section 2.2.\n+\n+The scope of an identifier can be either global or local. A local identifier's scope is limited to inside the braces `{ ... }` in which they are declared, whereas global identifiers are declared outside any braces.\n+\n+## 4: Expressions\n+\n+#### 4.1 Primary Expressions\n+\n+Primary expressions in FIRE can either because accessing an array type or a function call. The primary expression is followed by an expression of either asignments in the case of a function call or an accessing of the datatypes in an array.\n+\n+1. `Primary Expression [ expression ]`\n+2. `Primary Expression ( expression )`\n+\n+\n+#### 4.2 Assignment Operator\n+\n+The assignment operators `=` returns the value of the expression that is evaluated on its right-hand side and stores it in the identifier on the left hand side. The scope of that identifier is described in [section 3](#Identifiers)\n+\n+#### 4.3 Function Calls\n+\n+Functions take in arguments by value except in the case of other functions which are passed by reference. Functions need to be assigned before being called but can be declared anonymously. An anonymous function's scope is within the function that it is declared.\n+\n+#### 4.4 Logical Negation\n+\n+TODO We're considering adding booleans, its easier to parse.\n+\n+Although FIRE does not directly support a boolean type, it equates `true` expressions to `1` and false expressions to `0`. As such, the logical negation operator `!` will convert the result of the logical expression on which it is applied to the inverse of what would normally be expected.\n+\n+All non-zero integers are evaluated as `true` where as `0` is false.\n+\n+#### 4.5 Logical AND Operator\n+\n+The logical AND `&&` is a short circuit operator, and returns 1 if and only if the expressions on its left and right both evaluate to 1.\n+\n+#### 4.6 Logical OR Operator\n+\n+The logical OR `||` operator is a short circuit operator and returns 1 if either of the expressions on its left or right return 1.\n+\n+#### 4.7 Relational Operators\n+\n+The relational operators `<, >, <=, <=, ==` return `1` if the expression on the left side of the operator has the expected relation to the operator on the right-hand side.\n+\n+These relationships amongst ints are determined by natural ordering. Strings can only be evaluated using the `==` operator.\n+\n+#### 4.8 Pattern Match Operator\n+\n+The pattern match operator `===` returns `1` if the regular expression or string on its right side conforms to the rules laid out by the regular expression on its left side and returns `0` otherwise.\n+\n+Pattern matching operator l-values must be type `regx` and r-values must be type `string`.\n+\n+Example: `r'[a-z]+' === word`\n+\n+#### 4.9 String Concatination Operator\n+\n+The string concatenation `^` operator returns a new string that is the concatenation of the string on its left side and the string on its right side.\n+\n+#### 4.10 Bracket Operator\n+\n+The bracket operator `[]` can be used with either`string` or `array`.\n+\n+When used on`array` it is supplied a key and returns the corresponding element, or `-1` if it does not exist.\n+\n+When used on `string` it functions in a similar manner to character arrays in C. The r-value in brackets is an integer and returns the letter of that index, however unlike C, FIRE does not support chars so it returns a string of length 1.\n+\n+```\n+str hello = \"hello\";\n+str o = hello[4]; \n+```\n+#### 4.11 Slice operator \n+\n+The slice operator `[x:y]` is used on a string and returns a substring.\n+\n+#### 4.12 Map \n+\n+The map keyword allows a programmer to apply a function to every element of an array. \n+\n+Example: `map(f,arr1);` \n+\n+The map keyword does not mutate the values in the provided array; it instead returns a new array with results of every element of arr1 after they are passed to func f. \n+\n+#### 4.13 Filter \n+\n+The filter keyword takes any function that returns a boolean and applies it to elements of an array. This allows filter to quickly generate a new array that consists of elements that match whatever member criteria your function tests for.\n+\n+Example: `filter(f,arr1);`\n+\n+\n+In the above example, arr1 contains an array of strings that are either `dog` or `cat`. func f returns true if the element is equal to `dog`. The above expression would return an array only consisting of every element in arr1 that contains `dog`.\n+\n+\n+## 5: Declarations  \n+\n+Objects are instantiated via declarations, which explicitly assign a data type to a variable. In Fire a variable cannot be declared without also being assigned to a value. Types are explicit in FIRE. The format of a declaration is as follows:\n+\n+`{type} {variable name} = {value};`.\n+\n+#### 5.1 Data Types\n+\n+#### 5.1.1. `int`\n+\n+Identifiers of type `int` represent the natural numbers. The upper and lower bounds for int are defined by the architechtural constraints of the computer.\n+\n+Example:\n+\n+`int num = 32;`\n+\n+`int` types can also be assigned to the result of expressions:\n+\n+`int a = 34 * 2 + (2 / 1);`\n+\n+#### 5.1.2. `str`\n+\n+Identifiers of type `str` are used to represent sequences of characters, strings. Strings are immutable and can be declared in the following manner:\n+\n+Example:\n+\n+`str myString = \"Hello World\";`\n+\n+#### 5.1.3. `file`\n+\n+Files are regarded as first-class citizens in FIRE. This is made apparent by the importance and centrality of files. A `file` type represents either an existing file or a file that is to be written. This allows the programmer to more easily perform operations on the file.\n+\n+The syntax for instantiating a `file` object is as follows:\n+\n+`file f = file(\"filename.csv\", \"<mode>\");`\n+\n+In the example provided above, two arguments are fed into the `file(...)` argument: *filename* for reading, writing or both, and *mode*. The *mode* argument can be `r` for read only, `w` for write only, and `rw` for both.\n+\n+Example:\n+\n+`file f = file(\"test.csv\", \"rw\");` will open the File named test.csv in the current directory for both reading and writing.\n+  \n+`file f = file(\"filename.csv\", \"<mode>\", \"<delim>\");`\n+\n+An optional third argument *delim* may be provided to the constructor specifying a delimiter for reading. If the *delim* argument is not supplied it will default to `\\n`.\n+\n+Example:\n+\n+`file f = file(\"Program.java\", \"rw\", \";\");` will open the File named `Program.Java` in the current directory for both reading and writing. Calls to `read()` will read in chunks of the file delimited by the `;` character.\n+\n+#### 5.1.4. `func`\n+\n+`func` objects reference functions and are treated as first class citizens. The structure of `func` variable declarations is as follows:\n+\n+`func <return type> <name> = (<parameters>) => { <function body> };`\n+\n+Where:\n+ * `<return type>` is the type returned by the function\n+ * `<name>` is the variable name of the function\n+ * `<paramters>` are the expected parameters for the function\n+ * `<function body>` is the body of the function\n+ \n+Once a function has been assigined to a `func` type it becomes a \"named function\" that is callable using that name e.g `funcName();`\n+\n+A function that does not return anything has a return type of `void`.  The void return type allows for programmers to create functions that are useful for their side effects. \n+\n+##### Paramaterization\n+\n+Named functions can be passed to other functions as a parameter as follows\\:\n+```\n+func void saySomething = () =>{ print(\"something\"); };\n+func void doSomething = (func f) => { f(); };\n+doSomething(saySomething);\n+```\n+\n+##### Caveats\n+\n+* Fire does not support function overloading\n+* Fire does not support genericity in functions\n+\n+#### 5.1.4. `array`\n+\n+The `array` type is a dynamic collection of elements. Inspired by AWK's associative arrays, an `array` collection maps keys of one type to values of one type. Keys and values do not have be the same type, but all keys must share the same type and all values must share the same type.\n+\n+The structure of `array` variable declarations is as follows:\n+\n+`array arr[<key_type>, <value_type>];`\n+\n+Example:\n+\n+`array arr[int, string];` \n+\n+The assignment of variables has the following structure:\n+\n+`arr[<key_value>] = <element>;` \n+\n+Example:\n+\n+ `arr[17] = \"age17\";`\n+ \n+ Finally, a programmer can retrieve a value associated with a key with the below syntax:\n+ \n+ `int element = arr[<key_value>];`\n+ \n+ Example:\n+ \n+ `int age = arr[\"age\"];`\n+ \n+#### 5.1.5. `regx`\n+\n+Regular expressions are supported in FIRE. Via the `regx` type, which assigns an object to a regular expression. That object can then be passed as a parameter to functions that utilize regular expressions to a pattern match or extract data.\n+\n+The structure of a `regx` declaration is as follows:\n+\n+`regx myPattern = r'<pattern>'`\n+\n+Example:\n+\n+```\n+regx myPattern = r'[a-z]';\n+myFunction(someString, myPattern);\n+```\n+\n+The syntax for the regex patterns are as follows:\n+\n+* `\\` escapes any of the operators for the literal character\n+* `^` matches only the beginning of the string\n+* `$` matches only the end of the string\n+* `.` matches any single character\n+* `[ ... ]` defines a character list, where the character list can also be character range. This matches any string containing these characters\n+* `[^ ... ]` defines a character list, but negates them. This matches any string *not* containing these characters\n+* `|` matches either expression `e1` or `e2`\n+* `( ... )` groups expressions together where `...` is some regular expression\n+* `*` matches the preceding character 0 or many times\n+* `+` matches the preceding character at least once\n+\n+#### 5.1.6. `bool`\n+\n+Boolean objects contain a value of either `true` or `false`. They can be declared on their own, and are used in conditional statements.\n+\n+The structure of a boolean declaration:\n+\n+```\n+bool switch = true; // or false\n+```\n+\n+Example: \n+\n+```\n+int x = 0;\n+bool switch = true;\n+\n+// infinite loop\n+while(switch) {\n+\tx = x + 1;\n+}\n+```\n+\n+## 6: Statements \n+\n+#### 6.1 Print Statement\n+\n+The print statement prints a literal value, or the value returned by an expression.\n+\n+`print(\"i will be printed to stdout\");`\n+\n+#### 6.2 Conditional Statements\n+\n+Conditional statements evaluate expressions and execute code based on the truth values of those expressions.\n+\n+```\n+if (<expression>) {\n+\t<code block>\n+}\n+elif {\n+\t<code block>\n+}\n+else {\n+\t<code block>\n+}\n+```\n+\n+#### 6.3 For Statements\n+\n+For statements iterate over an `array` and execute a code block for every iteration. The code block can mutate the array elements, but can not add or remove elements from the array.\n+ex:\n+\n+```\n+for(str current : stringArray) {\n+    print(current);\n+}\n+``` \n+\n+#### 6.4 While Statements \n+\n+While statements execute a code block  until its provided condition fails to be met.\n+\n+```\n+while(<condition>) {\n+\t<code block>\n+}\n+```\n+\n+### 7: Code Sample\n+\n+The below is an example of `FIRE` in action. In the snippet below, a `FIRE` program is used to extract phone numbers that begin with a particular area code:\n+\n+\n+```\n+user:~ $ cat PhoneNumbers.csv\n+Dennis,201-445-9372\n+Kenneth,954-667-8990\n+Richie,312-421-0098\n+Thomas,201-750-0911\n+Albert,783-444-7862\n+\n+user:~ $ cat nj_numbers.fire\n+//\n+// Program that determines if a number is from NJ based on 201 area code\n+//\n+\n+func string isNJ = (str phoneNumber) => {\n+    return phoneNumber === r'201-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]';\n+};\n+\n+func array[int, str] extractRegion(func isRegion, file f) {\n+    \n+    array njnums[int, str];\n+    \n+    str number = f.readLine();\n+    int i = 0;\n+    \n+    while(number != \"\") {\n+        if(isNJ(number)){\n+            njnums[i,number].add;\n+\t         i = i + 1;\n+\t         number = f.readLine();\n+        }\n+    }\n+    return njnums;\n+}\n+\n+file f = file(\"PhoneNumbers.csv\", \"rw\", \",\");\n+\n+print( extractRegion(isNJ, f) );\n+\n+\n+user:~ $ cut -d' ' -f2 | fire nj_numbers.fire","path":"docs/LRM-feedback.md","position":416,"original_position":416,"commit_id":"5f932cc76f6d25fba8c576512d926e9717211194","original_commit_id":"5f932cc76f6d25fba8c576512d926e9717211194","user":{"login":"j-hui","id":11800204,"node_id":"MDQ6VXNlcjExODAwMjA0","avatar_url":"https://avatars2.githubusercontent.com/u/11800204?v=4","gravatar_id":"","url":"https://api.github.com/users/j-hui","html_url":"https://github.com/j-hui","followers_url":"https://api.github.com/users/j-hui/followers","following_url":"https://api.github.com/users/j-hui/following{/other_user}","gists_url":"https://api.github.com/users/j-hui/gists{/gist_id}","starred_url":"https://api.github.com/users/j-hui/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/j-hui/subscriptions","organizations_url":"https://api.github.com/users/j-hui/orgs","repos_url":"https://api.github.com/users/j-hui/repos","events_url":"https://api.github.com/users/j-hui/events{/privacy}","received_events_url":"https://api.github.com/users/j-hui/received_events","type":"User","site_admin":false},"body":"how this is run doesn't much sense...\r\n\r\n1. your language isn't interpreted. you're building a compiler, so invoking `fire` should just compile the `.fire` code, but not actually execute it.\r\n\r\n2. why is `cut` being piped into `fire`? how does your language handle `stdin`? and what file is `cut ` operating on?","created_at":"2018-10-28T18:54:28Z","updated_at":"2018-10-28T18:55:59Z","html_url":"https://github.com/pattersongp/plt-f18/pull/29#discussion_r228760215","pull_request_url":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/pattersongp/plt-f18/pulls/comments/228760215"},"html":{"href":"https://github.com/pattersongp/plt-f18/pull/29#discussion_r228760215"},"pull_request":{"href":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29"}}},"pull_request":{"url":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29","id":226386532,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI2Mzg2NTMy","html_url":"https://github.com/pattersongp/plt-f18/pull/29","diff_url":"https://github.com/pattersongp/plt-f18/pull/29.diff","patch_url":"https://github.com/pattersongp/plt-f18/pull/29.patch","issue_url":"https://api.github.com/repos/pattersongp/plt-f18/issues/29","number":29,"state":"open","locked":false,"title":"[DO NOT MERGE] LRM feedback","user":{"login":"j-hui","id":11800204,"node_id":"MDQ6VXNlcjExODAwMjA0","avatar_url":"https://avatars2.githubusercontent.com/u/11800204?v=4","gravatar_id":"","url":"https://api.github.com/users/j-hui","html_url":"https://github.com/j-hui","followers_url":"https://api.github.com/users/j-hui/followers","following_url":"https://api.github.com/users/j-hui/following{/other_user}","gists_url":"https://api.github.com/users/j-hui/gists{/gist_id}","starred_url":"https://api.github.com/users/j-hui/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/j-hui/subscriptions","organizations_url":"https://api.github.com/users/j-hui/orgs","repos_url":"https://api.github.com/users/j-hui/repos","events_url":"https://api.github.com/users/j-hui/events{/privacy}","received_events_url":"https://api.github.com/users/j-hui/received_events","type":"User","site_admin":false},"body":"Doing this so that feedback can be delivered inline using PR comments\r\n\r\nIt just creates a copy of your original `LRM.md`","created_at":"2018-10-28T18:15:09Z","updated_at":"2018-10-28T18:55:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7b0ba10d5438b039991f3be3db132855d5d9cfd9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29/commits","review_comments_url":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29/comments","review_comment_url":"https://api.github.com/repos/pattersongp/plt-f18/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pattersongp/plt-f18/issues/29/comments","statuses_url":"https://api.github.com/repos/pattersongp/plt-f18/statuses/5f932cc76f6d25fba8c576512d926e9717211194","head":{"label":"pattersongp:lrm-feedback","ref":"lrm-feedback","sha":"5f932cc76f6d25fba8c576512d926e9717211194","user":{"login":"pattersongp","id":23195969,"node_id":"MDQ6VXNlcjIzMTk1OTY5","avatar_url":"https://avatars0.githubusercontent.com/u/23195969?v=4","gravatar_id":"","url":"https://api.github.com/users/pattersongp","html_url":"https://github.com/pattersongp","followers_url":"https://api.github.com/users/pattersongp/followers","following_url":"https://api.github.com/users/pattersongp/following{/other_user}","gists_url":"https://api.github.com/users/pattersongp/gists{/gist_id}","starred_url":"https://api.github.com/users/pattersongp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pattersongp/subscriptions","organizations_url":"https://api.github.com/users/pattersongp/orgs","repos_url":"https://api.github.com/users/pattersongp/repos","events_url":"https://api.github.com/users/pattersongp/events{/privacy}","received_events_url":"https://api.github.com/users/pattersongp/received_events","type":"User","site_admin":false},"repo":{"id":147674861,"node_id":"MDEwOlJlcG9zaXRvcnkxNDc2NzQ4NjE=","name":"plt-f18","full_name":"pattersongp/plt-f18","private":false,"owner":{"login":"pattersongp","id":23195969,"node_id":"MDQ6VXNlcjIzMTk1OTY5","avatar_url":"https://avatars0.githubusercontent.com/u/23195969?v=4","gravatar_id":"","url":"https://api.github.com/users/pattersongp","html_url":"https://github.com/pattersongp","followers_url":"https://api.github.com/users/pattersongp/followers","following_url":"https://api.github.com/users/pattersongp/following{/other_user}","gists_url":"https://api.github.com/users/pattersongp/gists{/gist_id}","starred_url":"https://api.github.com/users/pattersongp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pattersongp/subscriptions","organizations_url":"https://api.github.com/users/pattersongp/orgs","repos_url":"https://api.github.com/users/pattersongp/repos","events_url":"https://api.github.com/users/pattersongp/events{/privacy}","received_events_url":"https://api.github.com/users/pattersongp/received_events","type":"User","site_admin":false},"html_url":"https://github.com/pattersongp/plt-f18","description":"Programming Languages and Translators","fork":false,"url":"https://api.github.com/repos/pattersongp/plt-f18","forks_url":"https://api.github.com/repos/pattersongp/plt-f18/forks","keys_url":"https://api.github.com/repos/pattersongp/plt-f18/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pattersongp/plt-f18/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pattersongp/plt-f18/teams","hooks_url":"https://api.github.com/repos/pattersongp/plt-f18/hooks","issue_events_url":"https://api.github.com/repos/pattersongp/plt-f18/issues/events{/number}","events_url":"https://api.github.com/repos/pattersongp/plt-f18/events","assignees_url":"https://api.github.com/repos/pattersongp/plt-f18/assignees{/user}","branches_url":"https://api.github.com/repos/pattersongp/plt-f18/branches{/branch}","tags_url":"https://api.github.com/repos/pattersongp/plt-f18/tags","blobs_url":"https://api.github.com/repos/pattersongp/plt-f18/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pattersongp/plt-f18/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pattersongp/plt-f18/git/refs{/sha}","trees_url":"https://api.github.com/repos/pattersongp/plt-f18/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pattersongp/plt-f18/statuses/{sha}","languages_url":"https://api.github.com/repos/pattersongp/plt-f18/languages","stargazers_url":"https://api.github.com/repos/pattersongp/plt-f18/stargazers","contributors_url":"https://api.github.com/repos/pattersongp/plt-f18/contributors","subscribers_url":"https://api.github.com/repos/pattersongp/plt-f18/subscribers","subscription_url":"https://api.github.com/repos/pattersongp/plt-f18/subscription","commits_url":"https://api.github.com/repos/pattersongp/plt-f18/commits{/sha}","git_commits_url":"https://api.github.com/repos/pattersongp/plt-f18/git/commits{/sha}","comments_url":"https://api.github.com/repos/pattersongp/plt-f18/comments{/number}","issue_comment_url":"https://api.github.com/repos/pattersongp/plt-f18/issues/comments{/number}","contents_url":"https://api.github.com/repos/pattersongp/plt-f18/contents/{+path}","compare_url":"https://api.github.com/repos/pattersongp/plt-f18/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pattersongp/plt-f18/merges","archive_url":"https://api.github.com/repos/pattersongp/plt-f18/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pattersongp/plt-f18/downloads","issues_url":"https://api.github.com/repos/pattersongp/plt-f18/issues{/number}","pulls_url":"https://api.github.com/repos/pattersongp/plt-f18/pulls{/number}","milestones_url":"https://api.github.com/repos/pattersongp/plt-f18/milestones{/number}","notifications_url":"https://api.github.com/repos/pattersongp/plt-f18/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pattersongp/plt-f18/labels{/name}","releases_url":"https://api.github.com/repos/pattersongp/plt-f18/releases{/id}","deployments_url":"https://api.github.com/repos/pattersongp/plt-f18/deployments","created_at":"2018-09-06T13:05:33Z","updated_at":"2018-10-28T16:56:03Z","pushed_at":"2018-10-28T18:15:10Z","git_url":"git://github.com/pattersongp/plt-f18.git","ssh_url":"git@github.com:pattersongp/plt-f18.git","clone_url":"https://github.com/pattersongp/plt-f18.git","svn_url":"https://github.com/pattersongp/plt-f18","homepage":null,"size":3762,"stargazers_count":0,"watchers_count":0,"language":"OCaml","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"pattersongp:master","ref":"master","sha":"43a724d96aaa63bd81027fc1ae223bf90446ffc6","user":{"login":"pattersongp","id":23195969,"node_id":"MDQ6VXNlcjIzMTk1OTY5","avatar_url":"https://avatars0.githubusercontent.com/u/23195969?v=4","gravatar_id":"","url":"https://api.github.com/users/pattersongp","html_url":"https://github.com/pattersongp","followers_url":"https://api.github.com/users/pattersongp/followers","following_url":"https://api.github.com/users/pattersongp/following{/other_user}","gists_url":"https://api.github.com/users/pattersongp/gists{/gist_id}","starred_url":"https://api.github.com/users/pattersongp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pattersongp/subscriptions","organizations_url":"https://api.github.com/users/pattersongp/orgs","repos_url":"https://api.github.com/users/pattersongp/repos","events_url":"https://api.github.com/users/pattersongp/events{/privacy}","received_events_url":"https://api.github.com/users/pattersongp/received_events","type":"User","site_admin":false},"repo":{"id":147674861,"node_id":"MDEwOlJlcG9zaXRvcnkxNDc2NzQ4NjE=","name":"plt-f18","full_name":"pattersongp/plt-f18","private":false,"owner":{"login":"pattersongp","id":23195969,"node_id":"MDQ6VXNlcjIzMTk1OTY5","avatar_url":"https://avatars0.githubusercontent.com/u/23195969?v=4","gravatar_id":"","url":"https://api.github.com/users/pattersongp","html_url":"https://github.com/pattersongp","followers_url":"https://api.github.com/users/pattersongp/followers","following_url":"https://api.github.com/users/pattersongp/following{/other_user}","gists_url":"https://api.github.com/users/pattersongp/gists{/gist_id}","starred_url":"https://api.github.com/users/pattersongp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pattersongp/subscriptions","organizations_url":"https://api.github.com/users/pattersongp/orgs","repos_url":"https://api.github.com/users/pattersongp/repos","events_url":"https://api.github.com/users/pattersongp/events{/privacy}","received_events_url":"https://api.github.com/users/pattersongp/received_events","type":"User","site_admin":false},"html_url":"https://github.com/pattersongp/plt-f18","description":"Programming Languages and Translators","fork":false,"url":"https://api.github.com/repos/pattersongp/plt-f18","forks_url":"https://api.github.com/repos/pattersongp/plt-f18/forks","keys_url":"https://api.github.com/repos/pattersongp/plt-f18/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pattersongp/plt-f18/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pattersongp/plt-f18/teams","hooks_url":"https://api.github.com/repos/pattersongp/plt-f18/hooks","issue_events_url":"https://api.github.com/repos/pattersongp/plt-f18/issues/events{/number}","events_url":"https://api.github.com/repos/pattersongp/plt-f18/events","assignees_url":"https://api.github.com/repos/pattersongp/plt-f18/assignees{/user}","branches_url":"https://api.github.com/repos/pattersongp/plt-f18/branches{/branch}","tags_url":"https://api.github.com/repos/pattersongp/plt-f18/tags","blobs_url":"https://api.github.com/repos/pattersongp/plt-f18/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pattersongp/plt-f18/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pattersongp/plt-f18/git/refs{/sha}","trees_url":"https://api.github.com/repos/pattersongp/plt-f18/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pattersongp/plt-f18/statuses/{sha}","languages_url":"https://api.github.com/repos/pattersongp/plt-f18/languages","stargazers_url":"https://api.github.com/repos/pattersongp/plt-f18/stargazers","contributors_url":"https://api.github.com/repos/pattersongp/plt-f18/contributors","subscribers_url":"https://api.github.com/repos/pattersongp/plt-f18/subscribers","subscription_url":"https://api.github.com/repos/pattersongp/plt-f18/subscription","commits_url":"https://api.github.com/repos/pattersongp/plt-f18/commits{/sha}","git_commits_url":"https://api.github.com/repos/pattersongp/plt-f18/git/commits{/sha}","comments_url":"https://api.github.com/repos/pattersongp/plt-f18/comments{/number}","issue_comment_url":"https://api.github.com/repos/pattersongp/plt-f18/issues/comments{/number}","contents_url":"https://api.github.com/repos/pattersongp/plt-f18/contents/{+path}","compare_url":"https://api.github.com/repos/pattersongp/plt-f18/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pattersongp/plt-f18/merges","archive_url":"https://api.github.com/repos/pattersongp/plt-f18/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pattersongp/plt-f18/downloads","issues_url":"https://api.github.com/repos/pattersongp/plt-f18/issues{/number}","pulls_url":"https://api.github.com/repos/pattersongp/plt-f18/pulls{/number}","milestones_url":"https://api.github.com/repos/pattersongp/plt-f18/milestones{/number}","notifications_url":"https://api.github.com/repos/pattersongp/plt-f18/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pattersongp/plt-f18/labels{/name}","releases_url":"https://api.github.com/repos/pattersongp/plt-f18/releases{/id}","deployments_url":"https://api.github.com/repos/pattersongp/plt-f18/deployments","created_at":"2018-09-06T13:05:33Z","updated_at":"2018-10-28T16:56:03Z","pushed_at":"2018-10-28T18:15:10Z","git_url":"git://github.com/pattersongp/plt-f18.git","ssh_url":"git@github.com:pattersongp/plt-f18.git","clone_url":"https://github.com/pattersongp/plt-f18.git","svn_url":"https://github.com/pattersongp/plt-f18","homepage":null,"size":3762,"stargazers_count":0,"watchers_count":0,"language":"OCaml","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29"},"html":{"href":"https://github.com/pattersongp/plt-f18/pull/29"},"issue":{"href":"https://api.github.com/repos/pattersongp/plt-f18/issues/29"},"comments":{"href":"https://api.github.com/repos/pattersongp/plt-f18/issues/29/comments"},"review_comments":{"href":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29/comments"},"review_comment":{"href":"https://api.github.com/repos/pattersongp/plt-f18/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pattersongp/plt-f18/pulls/29/commits"},"statuses":{"href":"https://api.github.com/repos/pattersongp/plt-f18/statuses/5f932cc76f6d25fba8c576512d926e9717211194"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"j-hui"}}