carats 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. data/ChangeLog +2 -0
  2. data/LICENSE +5 -0
  3. data/README +67 -0
  4. data/Reapfile +72 -0
  5. data/ToDo +24 -0
  6. data/bench/b_harray.rb +49 -0
  7. data/bench/b_range.rb +64 -0
  8. data/demo/ansicolor/cdiff.rb +20 -0
  9. data/demo/ansicolor/example.rb +82 -0
  10. data/demo/io-reactor/chatserver.rb +347 -0
  11. data/doc/classes/Array.html +172 -0
  12. data/doc/classes/BBCode.html +638 -0
  13. data/doc/classes/BinaryReader.html +675 -0
  14. data/doc/classes/Binding.html +223 -0
  15. data/doc/classes/ByteOrder.html +284 -0
  16. data/doc/classes/Class.html +189 -0
  17. data/doc/classes/Constant.html +785 -0
  18. data/doc/classes/Constant/CGS.html +609 -0
  19. data/doc/classes/Continuation.html +113 -0
  20. data/doc/classes/Coroutine.html +387 -0
  21. data/doc/classes/CountingSemaphore.html +337 -0
  22. data/doc/classes/CrossCase.html +561 -0
  23. data/doc/classes/DynamicMixin.html +185 -0
  24. data/doc/classes/EnumerableWithArgs.html +550 -0
  25. data/doc/classes/Expect.html +428 -0
  26. data/doc/classes/Expect/DefaultChain.html +113 -0
  27. data/doc/classes/Expect/SeparatedPattern.html +223 -0
  28. data/doc/classes/Expect/Timeout.html +167 -0
  29. data/doc/classes/Expect/UnmatchedMessage.html +160 -0
  30. data/doc/classes/FileList.html +833 -0
  31. data/doc/classes/FloatString.html +534 -0
  32. data/doc/classes/Functor.html +211 -0
  33. data/doc/classes/HArray.html +1872 -0
  34. data/doc/classes/HTML.html +328 -0
  35. data/doc/classes/Heap.html +683 -0
  36. data/doc/classes/Heap/EmptyHeapException.html +111 -0
  37. data/doc/classes/Heap/Max.html +176 -0
  38. data/doc/classes/Heap/Min.html +176 -0
  39. data/doc/classes/IO.html +108 -0
  40. data/doc/classes/IO/Reactor.html +790 -0
  41. data/doc/classes/IO/Redirect.html +289 -0
  42. data/doc/classes/Infinity.html +320 -0
  43. data/doc/classes/Interval.html +1014 -0
  44. data/doc/classes/InvalidNackError.html +161 -0
  45. data/doc/classes/Kernel.html +204 -0
  46. data/doc/classes/Lisp.html +1132 -0
  47. data/doc/classes/Lisp/DottedPair.html +379 -0
  48. data/doc/classes/Lisp/Format.html +178 -0
  49. data/doc/classes/Lisp/Format/ArgumentError.html +126 -0
  50. data/doc/classes/Lisp/Format/Directives.html +155 -0
  51. data/doc/classes/Lisp/Format/Directives/ArgJump.html +178 -0
  52. data/doc/classes/Lisp/Format/Directives/Ascii.html +119 -0
  53. data/doc/classes/Lisp/Format/Directives/BeginCaseConversion.html +185 -0
  54. data/doc/classes/Lisp/Format/Directives/BeginConditional.html +307 -0
  55. data/doc/classes/Lisp/Format/Directives/BeginIteration.html +338 -0
  56. data/doc/classes/Lisp/Format/Directives/Binary.html +157 -0
  57. data/doc/classes/Lisp/Format/Directives/Character.html +228 -0
  58. data/doc/classes/Lisp/Format/Directives/CharacterDirective.html +203 -0
  59. data/doc/classes/Lisp/Format/Directives/ClauseSeparator.html +166 -0
  60. data/doc/classes/Lisp/Format/Directives/Decimal.html +119 -0
  61. data/doc/classes/Lisp/Format/Directives/Directive.html +397 -0
  62. data/doc/classes/Lisp/Format/Directives/DollarFP.html +205 -0
  63. data/doc/classes/Lisp/Format/Directives/EndCaseConversion.html +174 -0
  64. data/doc/classes/Lisp/Format/Directives/EndConditional.html +159 -0
  65. data/doc/classes/Lisp/Format/Directives/EndIteration.html +163 -0
  66. data/doc/classes/Lisp/Format/Directives/ExpFP.html +252 -0
  67. data/doc/classes/Lisp/Format/Directives/FFFP.html +224 -0
  68. data/doc/classes/Lisp/Format/Directives/Factory.html +180 -0
  69. data/doc/classes/Lisp/Format/Directives/FreshLine.html +175 -0
  70. data/doc/classes/Lisp/Format/Directives/GeneralFP.html +265 -0
  71. data/doc/classes/Lisp/Format/Directives/Hexadecimal.html +157 -0
  72. data/doc/classes/Lisp/Format/Directives/Indirection.html +183 -0
  73. data/doc/classes/Lisp/Format/Directives/Literal.html +187 -0
  74. data/doc/classes/Lisp/Format/Directives/NewLine.html +158 -0
  75. data/doc/classes/Lisp/Format/Directives/NewPage.html +158 -0
  76. data/doc/classes/Lisp/Format/Directives/Number.html +243 -0
  77. data/doc/classes/Lisp/Format/Directives/Octal.html +157 -0
  78. data/doc/classes/Lisp/Format/Directives/Plural.html +177 -0
  79. data/doc/classes/Lisp/Format/Directives/Print.html +237 -0
  80. data/doc/classes/Lisp/Format/Directives/Radix.html +432 -0
  81. data/doc/classes/Lisp/Format/Directives/SExpression.html +157 -0
  82. data/doc/classes/Lisp/Format/Directives/SkipWhitespace.html +165 -0
  83. data/doc/classes/Lisp/Format/Directives/Tabulate.html +198 -0
  84. data/doc/classes/Lisp/Format/Directives/Tilde.html +158 -0
  85. data/doc/classes/Lisp/Format/Directives/UnknownDirectiveError.html +117 -0
  86. data/doc/classes/Lisp/Format/Formatter.html +193 -0
  87. data/doc/classes/Lisp/Format/IncompleteParameterError.html +119 -0
  88. data/doc/classes/Lisp/Format/IndexError.html +126 -0
  89. data/doc/classes/Lisp/Format/Lexer.html +479 -0
  90. data/doc/classes/Lisp/Format/MalformedError.html +119 -0
  91. data/doc/classes/Lisp/Format/MissingParameterError.html +119 -0
  92. data/doc/classes/Lisp/Format/ModifierError.html +119 -0
  93. data/doc/classes/Lisp/Format/Output.html +239 -0
  94. data/doc/classes/Lisp/Format/ParameterError.html +126 -0
  95. data/doc/classes/Lisp/Format/Parameters.html +123 -0
  96. data/doc/classes/Lisp/Format/Parameters/Argument.html +172 -0
  97. data/doc/classes/Lisp/Format/Parameters/ArgumentCount.html +159 -0
  98. data/doc/classes/Lisp/Format/Parameters/Character.html +119 -0
  99. data/doc/classes/Lisp/Format/Parameters/Default.html +120 -0
  100. data/doc/classes/Lisp/Format/Parameters/Integer.html +119 -0
  101. data/doc/classes/Lisp/Format/Parameters/Parameter.html +206 -0
  102. data/doc/classes/Lisp/Format/Parser.html +212 -0
  103. data/doc/classes/Lisp/Format/Positioned.html +166 -0
  104. data/doc/classes/Lisp/Format/State.html +455 -0
  105. data/doc/classes/Lisp/Format/SyntaxError.html +126 -0
  106. data/doc/classes/Method.html +274 -0
  107. data/doc/classes/Method/DuckHunter.html +281 -0
  108. data/doc/classes/Module.html +709 -0
  109. data/doc/classes/Multiton.html +284 -0
  110. data/doc/classes/Multiton/New.html +164 -0
  111. data/doc/classes/Multiton/Semi.html +155 -0
  112. data/doc/classes/NackClass.html +322 -0
  113. data/doc/classes/NilClass.html +231 -0
  114. data/doc/classes/NilComparable.html +179 -0
  115. data/doc/classes/NotCopyable.html +273 -0
  116. data/doc/classes/Object.html +261 -0
  117. data/doc/classes/OpenStructable.html +346 -0
  118. data/doc/classes/OrderedHash.html +939 -0
  119. data/doc/classes/Parser.html +515 -0
  120. data/doc/classes/Parser/Main.html +178 -0
  121. data/doc/classes/Parser/Marker.html +475 -0
  122. data/doc/classes/Parser/Registry.html +354 -0
  123. data/doc/classes/Parser/Token.html +399 -0
  124. data/doc/classes/Parser/UnitToken.html +222 -0
  125. data/doc/classes/Ref.html +230 -0
  126. data/doc/classes/SimpleStringIO.html +183 -0
  127. data/doc/classes/StaticHash.html +202 -0
  128. data/doc/classes/String.html +172 -0
  129. data/doc/classes/Struct.html +181 -0
  130. data/doc/classes/SuperStruct.html +382 -0
  131. data/doc/classes/Term.html +156 -0
  132. data/doc/classes/Term/ANSIColor.html +185 -0
  133. data/doc/classes/Text.html +138 -0
  134. data/doc/classes/Text/Soundex.html +222 -0
  135. data/doc/classes/TextTagIterator.html +911 -0
  136. data/doc/classes/Time.html +119 -0
  137. data/doc/classes/Time/Limit.html +303 -0
  138. data/doc/classes/Time/Limit/Dummy.html +181 -0
  139. data/doc/classes/Timer.html +351 -0
  140. data/doc/classes/TracePoint.html +532 -0
  141. data/doc/classes/Tuple.html +178 -0
  142. data/doc/classes/Uninheritable.html +213 -0
  143. data/doc/classes/Version.html +783 -0
  144. data/doc/created.rid +1 -0
  145. data/doc/files/LICENSE.html +113 -0
  146. data/doc/files/README.html +201 -0
  147. data/doc/files/lib/carat/1st_rb.html +107 -0
  148. data/doc/files/lib/carat/ansicolor_rb.html +146 -0
  149. data/doc/files/lib/carat/attr_rb.html +101 -0
  150. data/doc/files/lib/carat/bbcode_rb.html +152 -0
  151. data/doc/files/lib/carat/binaryreader_rb.html +114 -0
  152. data/doc/files/lib/carat/binding-of-caller_rb.html +108 -0
  153. data/doc/files/lib/carat/byteorder_rb.html +107 -0
  154. data/doc/files/lib/carat/constant_rb.html +167 -0
  155. data/doc/files/lib/carat/coroutine_rb.html +156 -0
  156. data/doc/files/lib/carat/crosscase_rb.html +224 -0
  157. data/doc/files/lib/carat/duckhunter_rb.html +165 -0
  158. data/doc/files/lib/carat/dynamic-mixin_rb.html +101 -0
  159. data/doc/files/lib/carat/enumerable-args_rb.html +140 -0
  160. data/doc/files/lib/carat/expect_rb.html +137 -0
  161. data/doc/files/lib/carat/filelist_rb.html +130 -0
  162. data/doc/files/lib/carat/floatstring_rb.html +126 -0
  163. data/doc/files/lib/carat/functor_rb.html +140 -0
  164. data/doc/files/lib/carat/harray_rb.html +128 -0
  165. data/doc/files/lib/carat/heap_rb.html +154 -0
  166. data/doc/files/lib/carat/html-helpers_rb.html +116 -0
  167. data/doc/files/lib/carat/infinity_rb.html +142 -0
  168. data/doc/files/lib/carat/init_rb.html +127 -0
  169. data/doc/files/lib/carat/interval_rb.html +162 -0
  170. data/doc/files/lib/carat/io-reactor_rb.html +211 -0
  171. data/doc/files/lib/carat/io-redirect_rb.html +132 -0
  172. data/doc/files/lib/carat/lisp-format_rb.html +187 -0
  173. data/doc/files/lib/carat/lisp_rb.html +152 -0
  174. data/doc/files/lib/carat/macro_rb.html +129 -0
  175. data/doc/files/lib/carat/multiton_rb.html +178 -0
  176. data/doc/files/lib/carat/nack_rb.html +193 -0
  177. data/doc/files/lib/carat/nil-comparable_rb.html +126 -0
  178. data/doc/files/lib/carat/nil-missing_rb.html +101 -0
  179. data/doc/files/lib/carat/notcopyable_rb.html +166 -0
  180. data/doc/files/lib/carat/orderedhash_rb.html +107 -0
  181. data/doc/files/lib/carat/ostructable_rb.html +157 -0
  182. data/doc/files/lib/carat/parser-old_rb.html +239 -0
  183. data/doc/files/lib/carat/parser_rb.html +244 -0
  184. data/doc/files/lib/carat/ref_rb.html +107 -0
  185. data/doc/files/lib/carat/semaphore_rb.html +132 -0
  186. data/doc/files/lib/carat/snapshot_rb.html +152 -0
  187. data/doc/files/lib/carat/soundex_rb.html +128 -0
  188. data/doc/files/lib/carat/sstruct_rb.html +142 -0
  189. data/doc/files/lib/carat/statichash_rb.html +150 -0
  190. data/doc/files/lib/carat/tagiter_rb.html +236 -0
  191. data/doc/files/lib/carat/timelimit_rb.html +136 -0
  192. data/doc/files/lib/carat/timer_rb.html +153 -0
  193. data/doc/files/lib/carat/tracepoint_rb.html +160 -0
  194. data/doc/files/lib/carat/tuple_rb.html +123 -0
  195. data/doc/files/lib/carat/uninheritable_rb.html +101 -0
  196. data/doc/files/lib/carat/version_rb.html +141 -0
  197. data/doc/fr_class_index.html +159 -0
  198. data/doc/fr_file_index.html +78 -0
  199. data/doc/fr_method_index.html +663 -0
  200. data/doc/index.html +24 -0
  201. data/doc/rdoc-style.css +208 -0
  202. data/lib/carat-dev/README +11 -0
  203. data/lib/carat-dev/access-blocks/access_blocks.rb +42 -0
  204. data/lib/carat-dev/association/association.rb +70 -0
  205. data/lib/carat-dev/blankslate/blankslate.rb +51 -0
  206. data/lib/carat-dev/breakpoint.rb +518 -0
  207. data/lib/carat-dev/class-constructor/constructor_methods.rb +78 -0
  208. data/lib/carat-dev/class-constructor/tc_constructor.rb +35 -0
  209. data/lib/carat-dev/closecall/closecall-test.rb +39 -0
  210. data/lib/carat-dev/closecall/closecall.rb +101 -0
  211. data/lib/carat-dev/commandrunner/commandrunner.rb +100 -0
  212. data/lib/carat-dev/conditional/conditionals.rb +106 -0
  213. data/lib/carat-dev/daemon/daemon.rb +70 -0
  214. data/lib/carat-dev/detach/detach.rb +363 -0
  215. data/lib/carat-dev/detach/tc_detach.rb +57 -0
  216. data/lib/carat-dev/import-module/import-module-0.81.tar.gz +0 -0
  217. data/lib/carat-dev/import-module/import-module-0.81/LICENSE +1 -0
  218. data/lib/carat-dev/import-module/import-module-0.81/Makefile +11 -0
  219. data/lib/carat-dev/import-module/import-module-0.81/README +4 -0
  220. data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-hash.rb +49 -0
  221. data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-pip.rb +71 -0
  222. data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-unbound-method.rb +36 -0
  223. data/lib/carat-dev/import-module/import-module-0.81/doc/README-ja.html +293 -0
  224. data/lib/carat-dev/import-module/import-module-0.81/doc/README-ja.rd +306 -0
  225. data/lib/carat-dev/import-module/import-module-0.81/doc/README.html +290 -0
  226. data/lib/carat-dev/import-module/import-module-0.81/doc/README.rd +303 -0
  227. data/lib/carat-dev/import-module/import-module-0.81/doc/style.css +85 -0
  228. data/lib/carat-dev/import-module/import-module-0.81/install.rb +99 -0
  229. data/lib/carat-dev/import-module/import-module-0.81/lib/import-module-single-thread.rb +84 -0
  230. data/lib/carat-dev/import-module/import-module-0.81/lib/import-module.rb +493 -0
  231. data/lib/carat-dev/import-module/import-module-0.81/test/Makefile +2 -0
  232. data/lib/carat-dev/import-module/import-module-0.81/test/test +91 -0
  233. data/lib/carat-dev/import-module/import-module-0.81/test/test-import-module.rb +936 -0
  234. data/lib/carat-dev/import-module/import-module-0.81/test/test-import_scope.rb +33 -0
  235. data/lib/carat-dev/import-module/import-module-0.81/test/test-scope_import.rb +33 -0
  236. data/lib/carat-dev/import-module/import-module-0.81/test/test-time.rb +184 -0
  237. data/lib/carat-dev/import-module/import-module-0.81/test/test.sh +91 -0
  238. data/lib/carat-dev/import-module/import-module-0.81/test/time.rb +135 -0
  239. data/lib/carat-dev/import-module/import-module-0.81/test/times-do.sh +10 -0
  240. data/lib/carat-dev/interface_work/SCRAP/i-contracts.rb +37 -0
  241. data/lib/carat-dev/interface_work/SCRAP/interface.rb +105 -0
  242. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0.zip +0 -0
  243. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/CHANGES +3 -0
  244. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/MANIFEST +15 -0
  245. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/README +32 -0
  246. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/doc/interface.rd +73 -0
  247. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/doc/interface.txt +94 -0
  248. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/install.rb +16 -0
  249. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/lib/interface.rb +50 -0
  250. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/tc_interface.rb +51 -0
  251. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test.rb +29 -0
  252. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_instance.rb +24 -0
  253. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_sub.rb +29 -0
  254. data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_unrequire.rb +28 -0
  255. data/lib/carat-dev/interface_work/contracts/contract.zip +0 -0
  256. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.html +376 -0
  257. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000001.html +23 -0
  258. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000002.html +18 -0
  259. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000003.html +19 -0
  260. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000004.html +29 -0
  261. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000005.html +18 -0
  262. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000006.html +18 -0
  263. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractError.html +142 -0
  264. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractException.html +153 -0
  265. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractMismatch.html +125 -0
  266. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Module.html +157 -0
  267. data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Module.src/M000007.html +112 -0
  268. data/lib/carat-dev/interface_work/contracts/contract/doc/created.rid +1 -0
  269. data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/assertions_rb.html +109 -0
  270. data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/exception_rb.html +108 -0
  271. data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/integration_rb.html +108 -0
  272. data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/overrides_rb.html +109 -0
  273. data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract_rb.html +114 -0
  274. data/lib/carat-dev/interface_work/contracts/contract/doc/fr_class_index.html +31 -0
  275. data/lib/carat-dev/interface_work/contracts/contract/doc/fr_file_index.html +31 -0
  276. data/lib/carat-dev/interface_work/contracts/contract/doc/fr_method_index.html +33 -0
  277. data/lib/carat-dev/interface_work/contracts/contract/doc/index.html +24 -0
  278. data/lib/carat-dev/interface_work/contracts/contract/doc/rdoc-style.css +208 -0
  279. data/lib/carat-dev/interface_work/contracts/contract/lib/contract.rb +88 -0
  280. data/lib/carat-dev/interface_work/contracts/contract/lib/contract/assertions.rb +37 -0
  281. data/lib/carat-dev/interface_work/contracts/contract/lib/contract/exception.rb +92 -0
  282. data/lib/carat-dev/interface_work/contracts/contract/lib/contract/integration.rb +132 -0
  283. data/lib/carat-dev/interface_work/contracts/contract/lib/contract/overrides.rb +32 -0
  284. data/lib/carat-dev/interface_work/must.rb +37 -0
  285. data/lib/carat-dev/interface_work/type.rb +232 -0
  286. data/lib/carat-dev/main/tc_toplevel.rb +23 -0
  287. data/lib/carat-dev/main/toplevel.rb +33 -0
  288. data/lib/carat-dev/main/toplevel_test.rb +24 -0
  289. data/lib/carat-dev/misc/1.rb +40 -0
  290. data/lib/carat-dev/misc/misc.rb +44 -0
  291. data/lib/carat-dev/misc/sys.rb +186 -0
  292. data/lib/carat-dev/misc/temp.rb +1 -0
  293. data/lib/carat-dev/misc/utils.rb +518 -0
  294. data/lib/carat-dev/predicate/predicate.rb +109 -0
  295. data/lib/carat-dev/predicate/predicate_test.rb +67 -0
  296. data/lib/carat-dev/premshree.rb +40 -0
  297. data/lib/carat-dev/priority-queue/pqueue.rb +183 -0
  298. data/lib/carat-dev/priority-queue/priorityqueue.rb +84 -0
  299. data/lib/carat-dev/quaternion/quaternion.rb +529 -0
  300. data/lib/carat-dev/range.rb +259 -0
  301. data/lib/carat-dev/system/rubyinfo.rb +75 -0
  302. data/lib/carat-dev/system/system.rb +105 -0
  303. data/lib/carat-dev/tc_range.rb +118 -0
  304. data/lib/carat-dev/timer/timer-doc/classes/Timer.html +291 -0
  305. data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000001.html +26 -0
  306. data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000002.html +19 -0
  307. data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000003.html +18 -0
  308. data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000004.html +18 -0
  309. data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000005.html +21 -0
  310. data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000006.html +23 -0
  311. data/lib/carat-dev/timer/timer-doc/created.rid +1 -0
  312. data/lib/carat-dev/timer/timer-doc/files/timer_rb.html +144 -0
  313. data/lib/carat-dev/timer/timer-doc/fr_class_index.html +27 -0
  314. data/lib/carat-dev/timer/timer-doc/fr_file_index.html +27 -0
  315. data/lib/carat-dev/timer/timer-doc/fr_method_index.html +32 -0
  316. data/lib/carat-dev/timer/timer-doc/index.html +24 -0
  317. data/lib/carat-dev/timer/timer-doc/rdoc-style.css +208 -0
  318. data/lib/carat-dev/timer/timer.rb +160 -0
  319. data/lib/carat-dev/vars/vars.rb +62 -0
  320. data/lib/carat/1st.rb +58 -0
  321. data/lib/carat/ansicolor.rb +122 -0
  322. data/lib/carat/attr.rb +342 -0
  323. data/lib/carat/bbcode.rb +352 -0
  324. data/lib/carat/binaryreader.rb +170 -0
  325. data/lib/carat/binding-of-caller.rb +83 -0
  326. data/lib/carat/byteorder.rb +34 -0
  327. data/lib/carat/constant.rb +287 -0
  328. data/lib/carat/coroutine.rb +102 -0
  329. data/lib/carat/crosscase.rb +309 -0
  330. data/lib/carat/duckhunter.rb +158 -0
  331. data/lib/carat/dynamic-mixin.rb +71 -0
  332. data/lib/carat/enumerable-args.rb +125 -0
  333. data/lib/carat/expect.rb +192 -0
  334. data/lib/carat/filelist.rb +277 -0
  335. data/lib/carat/floatstring.rb +153 -0
  336. data/lib/carat/functor.rb +41 -0
  337. data/lib/carat/harray.rb +507 -0
  338. data/lib/carat/heap.rb +193 -0
  339. data/lib/carat/html-helpers.rb +82 -0
  340. data/lib/carat/infinity.rb +61 -0
  341. data/lib/carat/init.rb +33 -0
  342. data/lib/carat/interval.rb +248 -0
  343. data/lib/carat/io-reactor.rb +657 -0
  344. data/lib/carat/io-redirect.rb +99 -0
  345. data/lib/carat/lisp-format.rb +1832 -0
  346. data/lib/carat/lisp.rb +336 -0
  347. data/lib/carat/macro.rb +68 -0
  348. data/lib/carat/multiton.rb +153 -0
  349. data/lib/carat/nack.rb +115 -0
  350. data/lib/carat/nil-comparable.rb +67 -0
  351. data/lib/carat/nil-missing.rb +12 -0
  352. data/lib/carat/notcopyable.rb +68 -0
  353. data/lib/carat/orderedhash.rb +249 -0
  354. data/lib/carat/ostructable.rb +138 -0
  355. data/lib/carat/parser-old.rb +350 -0
  356. data/lib/carat/parser.rb +393 -0
  357. data/lib/carat/ref.rb +31 -0
  358. data/lib/carat/semaphore.rb +69 -0
  359. data/lib/carat/snapshot.rb +94 -0
  360. data/lib/carat/soundex.rb +104 -0
  361. data/lib/carat/sstruct.rb +223 -0
  362. data/lib/carat/statichash.rb +49 -0
  363. data/lib/carat/tagiter.rb +345 -0
  364. data/lib/carat/timelimit.rb +114 -0
  365. data/lib/carat/timer.rb +99 -0
  366. data/lib/carat/tracepoint.rb +154 -0
  367. data/lib/carat/tuple.rb +31 -0
  368. data/lib/carat/uninheritable.rb +68 -0
  369. data/lib/carat/version.rb +147 -0
  370. data/pub/doc/sstruct.txt +204 -0
  371. data/pub/doc/tagiter.html +145 -0
  372. data/setup.rb +1361 -0
  373. data/test/fixtures/filelist/testfile.txt +1 -0
  374. data/test/fixtures/filelist/testfile2.txt +1 -0
  375. data/test/tc_1st.rb +16 -0
  376. data/test/tc_ansicolor.rb +23 -0
  377. data/test/tc_attr.rb +46 -0
  378. data/test/tc_bbcode.rb +20 -0
  379. data/test/tc_binaryreader.rb +14 -0
  380. data/test/tc_binding_of_caller.rb +2 -0
  381. data/test/tc_byteorder.rb +41 -0
  382. data/test/tc_constant.rb +12 -0
  383. data/test/tc_coroutine.rb +50 -0
  384. data/test/tc_crosscase.rb +33 -0
  385. data/test/tc_duckhunter.rb +37 -0
  386. data/test/tc_dynamic-mixin.rb +66 -0
  387. data/test/tc_enumerable-args.rb +66 -0
  388. data/test/tc_expect.rb +83 -0
  389. data/test/tc_filelist.rb +17 -0
  390. data/test/tc_floatstring.rb +22 -0
  391. data/test/tc_functor.rb +18 -0
  392. data/test/tc_harray.rb +280 -0
  393. data/test/tc_heap.rb +6 -0
  394. data/test/tc_infinity.rb +23 -0
  395. data/test/tc_init.rb +29 -0
  396. data/test/tc_interval.rb +153 -0
  397. data/test/tc_io-reactor.rb +5 -0
  398. data/test/tc_io-redirect.rb +5 -0
  399. data/test/tc_lisp-format.rb +24 -0
  400. data/test/tc_lisp.rb +32 -0
  401. data/test/tc_macro.rb +48 -0
  402. data/test/tc_multiton.rb +188 -0
  403. data/test/tc_nack.rb +31 -0
  404. data/test/tc_nil-as-emptiness.rb +19 -0
  405. data/test/tc_nil-comparable.rb +29 -0
  406. data/test/tc_nil-missing.rb +0 -0
  407. data/test/tc_notcopyable.rb +64 -0
  408. data/test/tc_orderedhash.rb +36 -0
  409. data/test/tc_ostructable.rb +31 -0
  410. data/test/tc_semaphore.rb +5 -0
  411. data/test/tc_snapshot.rb +20 -0
  412. data/test/tc_soundex.rb +19 -0
  413. data/test/tc_sstruct.rb +313 -0
  414. data/test/tc_statichash.rb +24 -0
  415. data/test/tc_tagiter.rb +80 -0
  416. data/test/tc_timelimit.rb +47 -0
  417. data/test/tc_timer.rb +35 -0
  418. data/test/tc_tracepoint.rb +10 -0
  419. data/test/tc_tuple.rb +25 -0
  420. data/test/tc_uninheritable.rb +33 -0
  421. data/test/tc_version.rb +90 -0
  422. metadata +531 -0
@@ -0,0 +1,529 @@
1
+ # K.Kodama 2002,9,23
2
+ # This program is distributed freely
3
+ # in the sense of GNU General Public License or ruby's.
4
+
5
+ warn "This Quaternion class is still very experimental version."
6
+
7
+ =begin
8
+ Quaternions are attributed to Sir William Rowan Hamilton
9
+ who find it in 1843, and published a major analysis in 1844 called
10
+ "On a Species of Imaginary Quantities Connected with a Theory of Quaternions"
11
+ in the Proceedings of the Royal Irish Academ. (2, pp 424-434).
12
+
13
+ Typical quaternion number q is of the form q = r + a i + b j + c k.
14
+ Bases i j k behaves as follows:
15
+ i^2 = j^2 = k^2 = -1,
16
+ i j = k, j k = i, k i = j,
17
+ j i = -k, k j = -i, i k = -j.
18
+ Quaternion numbers are not Commutative.
19
+ Quaternion is
20
+ 4-D space over Real number,
21
+ and 2-D space over Complex numbers as q = (a + b i) + (c + d i)j.
22
+
23
+
24
+ Polar Coordinates:
25
+ A Quaternion q = r + a i + b j + k c have 1st level polar form such that
26
+ q = |q|(cos t1 + sin t1 u1) , where u1 is unit vector of u1 = a1 i + b1 j + c1 k.
27
+ u1 have 2nd level
28
+ u1 = i cos t2 + sin t2 u2, where u2 is unit vector of u2 = b2 j + c2 k.
29
+ And u2 have 3rd level
30
+ u2 = j cos t3 + k sin t3.
31
+ So we have
32
+ q=|q|( cos t1 + sin t1 ( i cos t2 + sin t2 ( j cos t3 + k sin t3 ))).
33
+ The equivalent to polar coordinates in quaternion space are
34
+ r = |q| cos(t1),
35
+ a = |q| sin(t1) cos(t2),
36
+ b = |q| sin(t1) sin(t2) cos(t3),
37
+ c = |q| sin(t1) sin(t2) sin(t3).
38
+
39
+ |q| is known as the magnitude of the quaternion,
40
+ t1 is the amplitude(or angle),
41
+ t2 and t3 are the latitude (or co-latitude) and longitude respectively.
42
+
43
+
44
+ Vector:
45
+ A Quaternions q= r + a i + b j + c k is 4-D space over Real numbers.
46
+ A Quaternions with zero real part q = a i + b j + c k is 3-D space,
47
+ and called a vector quaternion or, simply, vector.
48
+ For q = r + a i + b j + c k,
49
+ v=a i + b j + c k is called vector part of q.
50
+ A vector u of |u|=1 is called a unit vector.
51
+ We can write q = r + u |v| = |q|(cos t + u sin t).
52
+ Note that u^2=-1.
53
+ Vectors are 3-D space And can define cross-product q1 x q2.
54
+
55
+ Rotation:
56
+ Quaternion can be used to describe rotation in 3-D space.
57
+ For a vector v and a Quaternion q = |q|(cos t/2 + u sin t/2),
58
+ q v q^(-1) is a vector v t-rotated along u.
59
+ Composit rotation of q1, q2 is described as q2 q1,
60
+ because q2 (q1 v q1^(-1)) q2^(-1) = (q2 q1) v (q2 q1)^(-1).
61
+
62
+
63
+ GCD:
64
+ D4 lattice space is lattice points of Quaternion q = r + a i + b j + c k as follows.
65
+ (1) r,a,b,c are all integer, or
66
+ (2) r,a,b,c are all half-integer.
67
+ D4 is sub-ring of Quaternion with GCD.
68
+ (Ring means a space with +, -, *.)
69
+ =end
70
+
71
+
72
+ =begin
73
+
74
+ * Building quaternions and taking them apart
75
+ Quaternion(real number r) # r as quaternion
76
+ Quaternion(a+bi) # a+bi as quaternion
77
+ Quaternion(a+bi,c+di) # a+bi+cj+dk = (a+bi)+(c+di)j
78
+ Quaternion(a,b=0,c=0,d=0) # a+bi+cj+dk
79
+ Quaternion(quaternion number q) # return q
80
+ Quaternion::Zero (=0 as quaternion)
81
+ Quaternion::One (=1 as quaternion)
82
+ Quaternion::I (=i as quaternion)
83
+ Quaternion::J (=j)
84
+ Quaternion::K (=k)
85
+ q.re ( = real part of q)
86
+ q.real ( = real part of q)
87
+ q.real_part ( = real part of q)
88
+ q.im ( = i part of q)
89
+ q.image ( = i part of q)
90
+ q.jm ( = j part of q)
91
+ q.km ( = k part of q)
92
+ orthogonal_split(o)
93
+ return [q1,q2].
94
+ q = q1 + q2 such that q1 parallel to o, and q2 orthogonal to o.
95
+
96
+ * Vector
97
+ q.vector ( = vector part of q = non-real part of q)
98
+ q.unit_vector ( = unit vector of q)
99
+ Quaternian::vector(v)
100
+ # 3-D vector v=[x,y,z] as array to Quaternion vector
101
+ Quaternion::rotation(v,t)
102
+ # t-rotatin along the 3-D vector v
103
+ q.rotate(r)
104
+ rotate by r = q r^(-1)
105
+ q.rotate_angle
106
+ # = q.amplitude/2
107
+
108
+ * Polar notation
109
+ Quaternion::polar(m,t1=0,t2=0,t3=0)
110
+ q.magnitude (= |q|)
111
+ q.amplitude (=arg1)
112
+ q.latitude (=arg2)
113
+ q.longitude (=arg3)
114
+ q.arg1
115
+ q.arg2
116
+ q.arg3
117
+ q.abs ( = |q| )
118
+ q.abs2 ( = |q|^2 )
119
+ q.polar # get array of [magnitude, amplitude, latitude, longitude]
120
+
121
+ * Boolean
122
+ Quaternion::generic?(other)
123
+ q.is_vector? # have no real part
124
+ q.is_unit_vector? # q is vector and |q|=1
125
+ q.is_complex? # j part =0 and k part = 0
126
+ q.is_quaternion? # have j or k part
127
+ q.is_real? # i,j,k parts are all 0
128
+
129
+ * Arithmetic
130
+ q.conjugate (= q~)
131
+ q.inverse (=1/q)
132
+ q1<=>q2 ( same as |q1|<=>|q2| )
133
+ q1==q2
134
+ q1 + q2
135
+ q1 - q2
136
+ q1 * q2
137
+ q1 / q2
138
+ q1.dot_product(q2) (Dot product q1, q2 = (q1*q2.conjugate).real_part )
139
+ q1.cross_product(q2) (Cross product as vectors q1,q2)
140
+ Assume q1, q2 be 3-D vectors.
141
+ q1.rdiv(q2) # right division: q1/q2 (same as /)
142
+ q1.ldiv(q2) # left division: 1/q1 * q2
143
+
144
+ * lattice or D4-lattice
145
+ q.round # round to integer coefficients
146
+ q.round_D4 # round to D4 lattice
147
+ q1.divmod(q2) # right divmod: q1=d*q2+m
148
+ q1.ldivmod(q2) # left divmod: q2=q1*d+m
149
+ q1 % q2 # right mod
150
+ q1.rmod(q2) # right mod(same as %)
151
+ q1.lmod(q2) # left mod
152
+ divmod_D4 other # right divmod: q1=d*q2+m, d be D4 value
153
+ ldivmod_D4 other # left divmod: q2=q1*d+m, d be D4 value
154
+ rmod_D4 other # right mod with d be D4 value
155
+ lmod_D4 other # left mod with d be D4 value
156
+ q1.gcd(q2) # Asume that q1, q2 are D4 value
157
+
158
+ * Exponential and logarithmic functions
159
+ q.exp # e^(r+uv)=exp(r)(cos(v)+u*sin(v))
160
+ q.log # log(r+uv)=1/2 log(r^2+v^2)+u atan(v/w)
161
+ q1**q2 ( = q1^q2 )
162
+ q.sqrt ( = q^1/2 )
163
+ q.sinh
164
+ q.cosh
165
+ q.tanh
166
+
167
+ * Trigonometric functions
168
+ q.sin
169
+ q.cos
170
+ q.tan
171
+
172
+ * Inverse trigonometric functions
173
+ q.asin
174
+ q.acos
175
+ q.atan
176
+
177
+ * Conversion
178
+ to_s # get string
179
+ to_c # real and i part as complex
180
+ to_c2 # j and k part as complex
181
+ to_v # vector part as array
182
+ to_a # array of parts
183
+
184
+ * Other
185
+ q.hash
186
+ q.inspect
187
+ =end
188
+
189
+
190
+ require "mathn"
191
+ require "complex"
192
+
193
+ def Quaternion(a=0, b=0,c=0, d=0)
194
+ if a.kind_of?(Quaternion);
195
+ a;
196
+ elsif a.kind_of?(Complex) and b.kind_of?(Complex);
197
+ Quaternion.new(a.real, a.image, b.real, b.image)
198
+ elsif a.kind_of?(Complex);
199
+ Quaternion.new(a.real, a.image)
200
+ else
201
+ Quaternion.new(a,b,c,d);
202
+ end
203
+ end
204
+
205
+ class Quaternion < Numeric
206
+ attr :re
207
+ attr :im
208
+ attr :jm
209
+ attr :km
210
+ def image; return @im; end
211
+ def real_part; return @re; end
212
+ def real; return @re; end
213
+ def to_c; return Complex(@re,@im); end
214
+ def to_c2; return Complex(@jm,@km); end
215
+ def to_a; return [@re, @im, @jm, @km]; end
216
+ def Quaternion::generic?(other)
217
+ return (other.kind_of?(Complex) or Complex.generic?(other));
218
+ end
219
+ def initialize(a=0,b=0,c=0,d=0)
220
+ raise "non numeric 1st arg `#{a.inspect}'" if !a.kind_of? Numeric;
221
+ raise "non numeric 2nd arg `#{b.inspect}'" if !b.kind_of? Numeric;
222
+ raise "non numeric 3rd arg `#{c.inspect}'" if !c.kind_of? Numeric;
223
+ raise "non numeric 4th arg `#{d.inspect}'" if !d.kind_of? Numeric;
224
+ @re=a; @im=b; @jm=c; @km=d
225
+ end
226
+ private :initialize
227
+
228
+ Zero=Quaternion(0)
229
+ One=Quaternion(1)
230
+ I=Quaternion(0,1)
231
+ J=Quaternion(0,0,1)
232
+ K=Quaternion(0,0,0,1)
233
+
234
+ def Quaternion::polar(m,t1=0,t2=0,t3=0)
235
+ # q=
236
+ # m*cos(t1)
237
+ # +m*sin(t1)cos(t2)i
238
+ # +m*sin(t1)sin(t2)cos(t3)j
239
+ # +m*sin(t1)sin(t2)sin(t3)k
240
+ # m is known as the magnitude,
241
+ # t1 is the amplitude(or angle) of the quaternion,
242
+ # t2 and t3 are the latitude (or co-latitude) and longitude respectively.
243
+ if m.kind_of?(Array) and (m.size==4); t1=m[1]; t2=m[2]; t3=m[3]; m=m[0]; end;
244
+ s=m
245
+ r_part=s*Math.cos(t1); s=s*Math.sin(t1)
246
+ i_part=s*Math.cos(t2); s=s*Math.sin(t2)
247
+ j_part=s*Math.cos(t3); k_part=s*Math.sin(t3)
248
+ new(r_part, i_part, j_part, k_part)
249
+ end
250
+ def amplitude; Math.atan2(Math.sqrt((@im*@im+@jm*@jm+@km*@km).to_f),@re.to_f); end
251
+ def latitude; Math.atan2(Math.sqrt((@jm*@jm+@km*@km).to_f),@im.to_f); end
252
+ def longitude; Math.atan2( @km.to_f, @jm.to_f); end
253
+ def arg1; return amplitude; end
254
+ def arg2; return latitude; end
255
+ def arg3; return longitude; end
256
+ def polar; [magnitude, amplitude, latitude, longitude]; end
257
+
258
+ def round; Quaternion(@re.round,@im.round,@jm.round,@km.round);end
259
+ def round_D4
260
+ # round to D4 lattice
261
+ r1=@re.round; a1=@im.round; b1=@jm.round; c1=@km.round;
262
+ q1=Quaternion(r1,a1,b1,c1); d1=(q1-self).abs2
263
+ if d1<=1/4; return q1; end
264
+ if @re<r1; r2=r1-1/2; else r2=r1+1/2; end
265
+ if @im<r1; a2=a1-1/2; else a2=a1+1/2; end
266
+ if @jm<r1; b2=b1-1/2; else b2=b1+1/2; end
267
+ if @km<r1; c2=c1-1/2; else c2=c1+1/2; end
268
+ q2=Quaternion(r2,a2,b2,c2); d2=(q2-self).abs2
269
+ if d1<=d2; return q1; else return q2; end
270
+ end
271
+ def abs2; return @re*@re+@im*@im+@jm*@jm+@km*@km; end
272
+ def abs; Math.sqrt((@re*@re+@im*@im+@jm*@jm+@km*@km).to_f); end
273
+ def magnitude; return abs; end
274
+ def conjugate; Quaternion(@re,-@im,-@jm,-@km); end
275
+ def inverse; conjugate/abs2; end
276
+
277
+ def is_real?; @im==0 and @jm==0 and @km==0; end
278
+ def is_complex?; @jm==0 and @km==0; end
279
+ def is_quaternion?; not(is_complex?); end
280
+
281
+ def vector; Quaternion(0,@im,@jm,@km); end
282
+ def is_vector?; @re==0; end
283
+ def to_v; return [@im, @jm, @km]; end
284
+ def Quaternion::vector(v)
285
+ # 3-D vector v=[x,y,z]
286
+ Quaternion(0,v[0],v[1],v[2])
287
+ end
288
+ def unit_vector
289
+ if is_real?; return Quaternion(0,1); end
290
+ m=Math::sqrt((@im*@im+@jm*@jm+@km*@km).to_f)
291
+ Quaternion(0,@im/m,@jm/m,@km/m);
292
+ end
293
+ def is_unit_vector?; @re==0 and abs2==1; end
294
+ def Quaternion::rotation(v,t)
295
+ # t-rotatin along the 3-D vector v
296
+ (Quaternion::vector(v).unit_vector) * Math::sin(t/2) + Math::cos(t/2)
297
+ end
298
+ def rotate(r); r * self * r.conjugate / r.abs2; end
299
+ def rotate_angle; amplitude/2; end
300
+
301
+ # Arithmetic
302
+ def coerce(other)
303
+ if other.kind_of?(Complex); return Quaternion(other), self
304
+ elsif Complex::generic?(other); return Quaternion(other), self
305
+ else super
306
+ end
307
+ end
308
+ def <=> (other); self.abs <=> other.abs; end
309
+ def == (other)
310
+ if other.kind_of?(Quaternion)
311
+ return (@re==other.re and @im==other.im and @jm==other.jm and @km==other.km)
312
+ elsif other.kind_of?(Complex)
313
+ @re==other.real and @im==other.image and @jm==0 and @km==0
314
+ elsif Complex.generic?(other)
315
+ @re==other and @im==0 and @jm==0 and @km==0
316
+ else x , y = other.coerce(self); x == y
317
+ end
318
+ end
319
+ def + (other)
320
+ if other.kind_of?(Quaternion)
321
+ Quaternion(@re+other.re,@im+other.im,@jm+other.jm,@km+other.km)
322
+ elsif other.kind_of?(Complex)
323
+ Quaternion(@re+other.real,@im+other.image, @jm, @km)
324
+ elsif Complex.generic?(other)
325
+ Quaternion(@re+other.real,@im, @jm, @km)
326
+ else x , y = other.coerce(self); x + y
327
+ end
328
+ end
329
+ def - (other)
330
+ if other.kind_of?(Quaternion)
331
+ Quaternion(@re-other.re,@im-other.im,@jm-other.jm,@km-other.km)
332
+ elsif other.kind_of?(Complex)
333
+ Quaternion(@re-other.real,@im-other.image, @jm, @km)
334
+ elsif Complex.generic?(other)
335
+ Quaternion(@re-other.real,@im, @jm, @km)
336
+ else x , y = other.coerce(self); x - y
337
+ end
338
+ end
339
+ def * (other)
340
+ if other.kind_of?(Quaternion)
341
+ Quaternion(@re*other.re-@im*other.im-@jm*other.jm-@km*other.km,
342
+ @re*other.im+@im*other.re+@jm*other.km-@km*other.jm,
343
+ @re*other.jm-@im*other.km+@jm*other.re+@km*other.im,
344
+ @re*other.km+@im*other.jm-@jm*other.im+@km*other.re)
345
+ elsif other.kind_of?(Complex)
346
+ Quaternion(@re*other.real - @im*other.image,
347
+ @re*other.image + @im*other.real,
348
+ @jm*other.real + @km*other.image,
349
+ @km*other.real - @jm*other.image)
350
+ elsif Complex.generic?(other)
351
+ Quaternion(@re * other, @im * other, @jm * other, @km * other)
352
+ else x , y = other.coerce(self); x * y
353
+ end
354
+ end
355
+ def dot_product other
356
+ (self*other.conjugate).re
357
+ end
358
+ def cross_product other
359
+ -(self*other.conjugate).vector
360
+ end
361
+ def / other
362
+ if other.kind_of?(Quaternion); self*other.conjugate/other.abs2
363
+ elsif other.kind_of?(Complex); self*other.conjugate/other.abs2
364
+ elsif Complex.generic?(other);
365
+ Quaternion(@re/other, @im/other, @jm/other, @km/other )
366
+ else x, y = other.coerce(self); x / y
367
+ end
368
+ end
369
+ def rdiv other
370
+ # right division: q1/q2
371
+ self/other
372
+ end
373
+ def ldiv other
374
+ # left division: 1/q1 * q2
375
+ (self.conjugate)*other/self.abs2
376
+ end
377
+ def divmod other
378
+ # right divmod: q1=d*q2+m
379
+ d=self.rdiv(other).round; m=self-d*other; return d,m
380
+ end
381
+ def divmod_D4 other
382
+ # right divmod: q1=d*q2+m, d be D4
383
+ d=self.rdiv(other).round_D4; m=self-d*other; return d,m
384
+ end
385
+ def ldivmod other
386
+ # left divmod: q2=q1*d+m
387
+ d=self.ldiv(other).round; m=other-self*d; return d,m
388
+ end
389
+ def ldivmod_D4 other
390
+ # left divmod: q2=q1*d+m, d be D4
391
+ d=self.ldiv(other).round_D4; m=other-self*d; return d,m
392
+ end
393
+ def % other
394
+ # right mod
395
+ d,m=divmod(other); return m
396
+ end
397
+ def rmod other
398
+ # right mod(same as %)
399
+ d,m=divmod(other); return m
400
+ end
401
+ def rmod_D4 other
402
+ # right mod with D4
403
+ d,m=divmod_D4(other); return m
404
+ end
405
+ def lmod other
406
+ # left mod
407
+ d,m=ldivmod(other); return m
408
+ end
409
+ def lmod_D4 other
410
+ # left mod with D4
411
+ d,m=ldivmod_D4(other); return m
412
+ end
413
+ def gcd other
414
+ a=self; b=other
415
+ while true
416
+ if b==0 ; return a;end
417
+ a=a.rmod_D4(b)
418
+ if a==0 ; return b;end
419
+ b=a.lmod_D4(b)
420
+ end
421
+ end
422
+ def orthogonal_split(o)
423
+ # [q1,q2]. q = q1 + q2 such that q1 parallel to o, and q2 orthogonal to o.
424
+ q1 = o * dot_product(o); q2=self-q1; return q1,q2
425
+ end
426
+
427
+ # Exponential and logarithmic functions
428
+ def exp
429
+ # e^(r+uv)=exp(r)(cos(v)+u*sin(v))
430
+ if is_real?; return Quaternion(Math::exp(@re)); end
431
+ vec=self.vector; v=vec.abs; u = vec/v;
432
+ Math::exp(@re)*(Math::cos(v)+u*Math::sin(v))
433
+ end
434
+ def log
435
+ # log(r+uv)=1/2 log(r^2+v^2)+u atan(v/r)
436
+ if is_real?;
437
+ if @re>=0; return Quaternion(Math::log(@re));
438
+ else return Quaternion(Math::log(-@re),Math::PI,0,0);
439
+ end
440
+ end
441
+ vec=self.vector; v=vec.abs; u = vec/v;
442
+ Math::log(self.abs2.to_f)/2+u*Math::atan2( v, @re)
443
+ end
444
+ def ** other
445
+ # q1^q2 = exp((log q1)*q2)
446
+ if other.kind_of?(Quaternion); ((self.log)*other).exp
447
+ elsif other.kind_of?(Complex); ((self.log)*other).exp
448
+ elsif other.kind_of?(Integer);
449
+ if other==0; return One;
450
+ elsif other>0;
451
+ x = self; q = x; n = other - 1
452
+ while n != 0
453
+ while (d, m = n.divmod(2); m == 0); x = x*x; n = d; end
454
+ q *= x; n -= 1
455
+ end
456
+ return q
457
+ else return self.inverse**(-other)
458
+ end
459
+ elsif Quaternion::generic?(other); ((self.log)*other).exp
460
+ else x, y = other.coerce(self); x ** y
461
+ end;
462
+ end
463
+ def sqrt; self**(0.5); end
464
+ def sinh; e=exp; return (e-e.inverse)/2; end
465
+ def cosh; e=exp; return (e+e.inverse)/2; end
466
+ def tanh; e=exp; e=e*e; return (e-1)/(e+1); end
467
+ # Trigonometric functions
468
+ def sin
469
+ # sin(r+uv)=sin r cosh v + u cos r sinh v
470
+ vec=self.vector; v=vec.abs; if v==0; return Quaternion(Math::sin(@re)); end
471
+ u = vec/v; e=Math::exp(v); er=1/e; c=e+er; s=e-er
472
+ (Math::sin(@re)*c+u*Math::cos(@re)*s)/2
473
+ end
474
+ def cos
475
+ # cos(r+uv)=cos r cosh v - u sin r sinh v
476
+ vec=self.vector; v=vec.abs; if v==0; return Quaternion(Math::cos(@re)); end
477
+ u = vec/v; e=Math::exp(v); er=1/e; c=e+er; s=e-er
478
+ (Math::cos(@re)*c-u*Math::sin(@re)*s)/2
479
+ end
480
+ def tan
481
+ vec=self.vector; v=vec.abs; if v==0; return Quaternion(Math::tan(@re)); end
482
+ u = vec/v; e=Math::exp(v); er=1/e; c=e+er; s=e-er
483
+ co=Math::cos(@re); si=Math::sin(@re); (si*c+u*co*s)/(co*c-u*si*s)
484
+ end
485
+
486
+ # Inverse trigonometric functions
487
+ def asin
488
+ # asin q = -u log(uq+sqrt(1-q^2))
489
+ q=self; u=unit_vector; -u*((u*q+(1-q*q).sqrt).log)
490
+ end
491
+ def acos
492
+ # acos q = -u log(q+sqrt(q^2-1))
493
+ q=self; u=unit_vector; -u*((q+(q*q-1).sqrt).log)
494
+ end
495
+ def atan
496
+ # atan q = u/2 log( (u+q)/(u-q) )
497
+ q=self; u=q.unit_vector; u*((u+q)/(u-q)).log/2
498
+ end
499
+
500
+
501
+ def hash; @re^@im^@jm^@km; end
502
+
503
+ def inspect
504
+ sprintf("Quaternion(%s,%s,%s,%s)",
505
+ @re.inspect, @im.inspect, @jm.inspect, @km.inspect)
506
+ end
507
+ def to_s
508
+ s=""
509
+ if @re!=0; s=@re.to_s; end
510
+ if @im!=0;
511
+ if s==""; s=sprintf("%si", @im);
512
+ else if @im>0; s=sprintf("%s+%si",s,@im); else s=sprintf("%s-%si",s,-@im); end
513
+ end
514
+ end
515
+ if @jm!=0;
516
+ if s==""; s=sprintf("%sj", @jm);
517
+ else if @jm>0; s=sprintf("%s+%sj",s,@jm); else s=sprintf("%s-%sj",s,-@jm); end
518
+ end
519
+ end
520
+ if @km!=0;
521
+ if s==""; s=sprintf("%sk", @km);
522
+ else if @km>0; s=sprintf("%s+%sk",s,@km); else s=sprintf("%s-%sk",s,-@km); end
523
+ end
524
+ end
525
+ if s=="" ; s="0"; end;
526
+ return s
527
+ end
528
+
529
+ end # Quaternion