Guest User

Untitled

a guest
Jun 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. (ns convert
  2. (:require [clojure.zip :as z])
  3. (:use [overtone.sc.ugen :only [overtone-ugen-name]]
  4. [clojure.contrib.core :only [-?>]]))
  5.  
  6. (defn prepend-child
  7. [loc item]
  8. (z/replace loc (z/make-node loc (z/node loc) (concat [item] (z/children loc)))))
  9.  
  10. (defn zip-map [f zipper]
  11. (first (drop-while (complement z/end?) (iterate (comp z/next f) zipper))))
  12.  
  13. (defn tokenize [code]
  14. (z/root (reduce #(cond
  15. (#{\space \,} %2) (-> %1
  16. (z/insert-right "")
  17. z/right)
  18. (= \( %2) (-> %1
  19. (z/insert-right '())
  20. z/right
  21. (z/append-child "")
  22. z/down)
  23. (= \) %2) (z/up %1)
  24. true (z/edit %1 str %2))
  25. (z/down (z/seq-zip (list ""))) code)))
  26.  
  27. (defn infix [tokens]
  28. (loop [zipper (z/down (z/seq-zip tokens))]
  29. (if (-?> zipper
  30. z/right
  31. z/branch?)
  32. (recur (let [f (z/node zipper)]
  33. (-> zipper
  34. z/remove
  35. z/next
  36. (prepend-child f))))
  37. (if (z/end? zipper)
  38. (z/root zipper)
  39. (recur (z/next zipper))))))
  40.  
  41. (defn infix-math [tokens]
  42. (z/root (zip-map #(if (#{"+" "-" "*" "/"} (z/node %))
  43. (let [right (z/node (z/right %))
  44. left (z/node (z/left %))]
  45. (-> %
  46. z/right
  47. z/remove
  48. z/left
  49. z/remove
  50. z/next
  51. (z/replace (list (z/node %) left right))))
  52. %) (z/seq-zip tokens))))
  53.  
  54. (defn ban-kwmath [tokens]
  55. (z/root (zip-map
  56. #(if-let [op ({"add:" "+", "mul:" "*"} (z/node %))]
  57. (let [right (z/node (z/right %))
  58. left (-> %
  59. z/right
  60. z/remove
  61. z/remove
  62. z/up
  63. z/node)]
  64. (-> %
  65. z/up
  66. (z/replace (list op left right))))
  67. %)
  68. (z/seq-zip tokens))))
  69.  
  70. (defn fnames [tokens]
  71. (let [code (z/seq-zip tokens)
  72. overtone-ugen-name (comp
  73. #(.replaceAll % "\\.(ar|kr)" ":$1")
  74. overtone-ugen-name)]
  75. (z/root (zip-map #(if (string? (z/node %))
  76. (z/edit % overtone-ugen-name)
  77. %)
  78. code))))
  79.  
  80. (defn real-types [tokens]
  81. (z/root
  82. (zip-map #(if (z/branch? %)
  83. %
  84. (if (= "" (z/node %))
  85. (z/remove %)
  86. (z/replace % (read-string (z/node %)))))
  87. (z/seq-zip tokens))))
  88.  
  89. (defmacro sc [code]
  90. (-> code
  91. tokenize
  92. infix
  93. infix-math
  94. ban-kwmath
  95. fnames
  96. real-types
  97. (conj 'do)))
Add Comment
Please, Sign In to add comment