PageRenderTime 26ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/README.md

https://bitbucket.org/tonetheman/parenj
Markdown | 261 lines | 229 code | 32 blank | 0 comment | 0 complexity | 07fde3b3dcb945d6bfedc93d2424bbe3 MD5 | raw file
  1. # Parenj: The Paren Programming Language written in Java #
  2. (C) 2013 Kim, Taegyoon
  3. Paren is a dialect of Lisp. It is designed to be an embedded language. You can use Java in your Paren program.
  4. ## Compile ##
  5. ```
  6. cd src
  7. javac paren.java parenj.java
  8. ```
  9. ## Run ##
  10. ```
  11. Usage: java parenj [OPTIONS...] [FILES...]
  12. OPTIONS:
  13. -h print this screen.
  14. -v print version.
  15. ```
  16. ## Reference ##
  17. ```
  18. Predefined Symbols:
  19. ! != % && * + ++ - -- .
  20. .get .set / < <= = == > >= E
  21. PI ^ apply begin ceil char-at chr dec double eval
  22. exit false filter floor fn fold for if inc int
  23. length list ln log10 map new nth null pr prn
  24. quote rand range read-string set sqrt strcat string strlen system
  25. true type when while ||
  26. Etc.:
  27. (list) "string" ; end-of-line comment
  28. ```
  29. ## Files ##
  30. * paren.java: Paren language library
  31. * parenj.java: Paren REPL executable
  32. ## Examples ##
  33. ### Hello, World! ###
  34. ```
  35. (prn "Hello, World!")
  36. ```
  37. ### Function ###
  38. In a function, [lexical scoping](http://en.wikipedia.org/wiki/Lexical_scoping#Lexical_scoping) is used.
  39. ```
  40. > ((fn (x y) (+ x y)) 1 2)
  41. 3 : java.lang.Integer
  42. > ((fn (x) (* x 2)) 3)
  43. 6 : java.lang.Integer
  44. > (set sum (fn (x y) (+ x y)))
  45. : null
  46. > (sum 1 2)
  47. 3 : java.lang.Integer
  48. > (fold sum (range 1 10 1))
  49. 55 : java.lang.Integer
  50. > (set even? (fn (x) (== 0 (% x 2))))
  51. : null
  52. > (even? 3)
  53. false : java.lang.Boolean
  54. > (even? 4)
  55. true : java.lang.Boolean
  56. > (apply + (list 1 2 3))
  57. 6 : java.lang.Integer
  58. > (map sqrt (list 1 2 3 4))
  59. [1.0, 1.4142135623730951, 1.7320508075688772, 2.0] : java.util.Vector
  60. > (filter even? (list 1 2 3 4 5))
  61. [2, 4] : java.util.Vector
  62. > (= "abc" "abc") ; Object.equals()
  63. true : java.lang.Boolean
  64. > (set x 1)
  65. ((fn (x) (prn x) (set x 3) (prn x)) 4) ; lexical scoping
  66. x
  67. 4
  68. 3
  69. 1 : java.lang.Integer
  70. > (set adder (fn (amount) (fn (x) (+ x amount)))) ; lexical scoping
  71. (set add3 (adder 3))
  72. (add3 4)
  73. 7 : java.lang.Integer
  74. ```
  75. #### Recursion ####
  76. ```
  77. > (set factorial (fn (x) (if (<= x 1) x (* x (factorial (dec x))))))
  78. (for i 1 5 1 (prn i (factorial i)))
  79. 1 1
  80. 2 2
  81. 3 6
  82. 4 24
  83. 5 120
  84. : null
  85. ```
  86. ### List ###
  87. ```
  88. > (nth 1 (list 2 4 6))
  89. 4 : java.lang.Integer
  90. > (length (list 1 2 3))
  91. 3 : java.lang.Integer
  92. ```
  93. ### Java interoperability (from Paren) ###
  94. ```
  95. > (. java.lang.Math random) ; class's static method
  96. 0.4780254852371699 : java.lang.Double
  97. > (. java.lang.Math floor 1.5)
  98. 1.0 : java.lang.Double
  99. > (. "abc" length) ; object's method
  100. 3 : java.lang.Integer
  101. > (. true toString)
  102. true : java.lang.String
  103. > (set i 3)
  104. : null
  105. > (. i doubleValue)
  106. 3.0 : java.lang.Double
  107. > (.get java.lang.Math PI) ; get field
  108. 3.141592653589793 : java.lang.Double
  109. > (.get parenj testField)
  110. : null
  111. > (.set parenj testField 1) ; set field
  112. (.get parenj testField)
  113. 1 : java.lang.Integer
  114. > (.set parenj testField "abc")
  115. (.get parenj testField)
  116. abc : java.lang.String
  117. > (. (new java.math.BigInteger "2") pow 100) ; 2 ^ 100
  118. 1267650600228229401496703205376 : java.math.BigInteger
  119. ```
  120. ### Java interoperability (from Java) ###
  121. player.java
  122. ```
  123. public class player {
  124. private int life;
  125. public int getLife() {
  126. return life;
  127. }
  128. public void setLife(int life) {
  129. this.life = life;
  130. }
  131. }
  132. ```
  133. parenjTest.java
  134. ```
  135. public class parenjTest {
  136. public static Object testField;
  137. public static void main(String[] args) {
  138. paren p = new paren();
  139. player pl = new player();
  140. // Method 1: using class's field
  141. testField = pl;
  142. p.eval_string("(set pl (.get parenjTest testField))");
  143. p.eval_string("(. pl setLife 100)");
  144. System.out.println(p.eval_string("(. pl getLife)").intValue());
  145. // Method 2: not using class's field, set variable to Java's local variable
  146. p.global_env.env.put("pl2", new paren.node(pl));
  147. p.eval_string("(. pl2 setLife 200)");
  148. System.out.println(p.eval_string("(. pl2 getLife)").intValue());
  149. p.global_env.env.remove("p12"); // remove variable
  150. }
  151. }
  152. ```
  153. ### System Command ###
  154. ```
  155. (system "notepad" "a.txt")
  156. ```
  157. ### [Project Euler Problem 1](http://projecteuler.net/problem=1) ###
  158. ```
  159. (set s 0)
  160. (for i 1 999 1
  161. (when (|| (== 0 (% i 3)) (== 0 (% i 5)))
  162. (set s (+ s i))))
  163. (prn s)
  164. ```
  165. => 233168
  166. ```
  167. (apply + (filter (fn (x) (|| (== 0 (% x 3)) (== 0 (% x 5)))) (range 1 999 1)))
  168. ```
  169. => 233168
  170. ### [Project Euler Problem 2](http://projecteuler.net/problem=2) ###
  171. ```
  172. (set a 1)
  173. (set b 1)
  174. (set sum 0)
  175. (while (<= a 4000000)
  176. (set c (+ a b))
  177. (set a b)
  178. (set b c)
  179. (when (== 0 (% a 2))
  180. (set sum (+ sum a))))
  181. (prn sum)
  182. ```
  183. => 4613732
  184. ### [Project Euler Problem 4](http://projecteuler.net/problem=4) ###
  185. ```
  186. (set maxP 0)
  187. (for i 100 999 1
  188. (for j 100 999 1
  189. (set p (* i j))
  190. (set ps (string p))
  191. (set len (strlen ps))
  192. (set to (/ len 2))
  193. (set pal true)
  194. (set k 0)
  195. (set k2 (dec len))
  196. (while
  197. (&& (< k to) pal)
  198. (when (!= (char-at ps k) (char-at ps k2))
  199. (set pal false))
  200. (++ k)
  201. (-- k2))
  202. (when pal
  203. (when (> p maxP)
  204. (set maxP p)))))
  205. (prn maxP)
  206. ```
  207. => 906609
  208. [More solutions of Project Euler in Paren](https://bitbucket.org/ktg/euler-paren)
  209. ### [99 Bottles of Beer](http://en.wikipedia.org/wiki/99_Bottles_of_Beer) ###
  210. ```
  211. (for i 99 1 -1
  212. (prn i "bottles of beer on the wall," i "bottles of beer.")
  213. (prn "Take one down and pass it around," (dec i) "bottle of beer on the wall."))
  214. ```
  215. ## Alternative Implementations ##
  216. * [Paren](https://bitbucket.org/ktg/paren) (Paren running natively)
  217. * [Parenj](https://bitbucket.org/ktg/parenj) (Paren running on the Java Virtual Machine)
  218. * [Parenjs](https://bitbucket.org/ktg/parenjs) (Paren compiler targeting JavaScript)
  219. ## License ##
  220. Copyright 2013 Kim, Taegyoon
  221. Licensed under the Apache License, Version 2.0 (the "License");
  222. you may not use this file except in compliance with the License.
  223. You may obtain a copy of the License at
  224. [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
  225. Unless required by applicable law or agreed to in writing, software
  226. distributed under the License is distributed on an "AS IS" BASIS,
  227. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  228. See the License for the specific language governing permissions and
  229. limitations under the License.