quaternion_type.sf 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Quaternion_type
  4. #
  5. class Quaternion(r, i, j, k) {
  6. func qu(*r) { __CLASS__(r...) }
  7. method to_s { "#{r} + #{i}i + #{j}j + #{k}k" }
  8. method reals { [r, i, j, k] }
  9. method conj { qu(r, -i, -j, -k) }
  10. method norm { self.reals.map { _*_ }.sum.sqrt }
  11. method ==(__CLASS__ b) { self.reals == b.reals }
  12. method +(Number b) { qu(b+r, i, j, k) }
  13. method +(__CLASS__ b) { qu((self.reals ~Z+ b.reals)...) }
  14. method neg { qu(self.reals.map{ .neg }...) }
  15. method *(Number b) { qu((self.reals»*»b)...) }
  16. method *(__CLASS__ b) {
  17. var (r,i,j,k) = b.reals...
  18. qu(sum(self.reals ~Z* [r, -i, -j, -k]),
  19. sum(self.reals ~Z* [i, r, k, -j]),
  20. sum(self.reals ~Z* [j, -k, r, i]),
  21. sum(self.reals ~Z* [k, j, -i, r]))
  22. }
  23. }
  24. var q = main::Quaternion(1, 2, 3, 4)
  25. var q1 = main::Quaternion(2, 3, 4, 5)
  26. var q2 = main::Quaternion(3, 4, 5, 6)
  27. var r = 7
  28. say "1) q norm = #{q.norm}"
  29. say "2) -q = #{-q}"
  30. say "3) q conj = #{q.conj}"
  31. say "4) q + r = #{q + r}"
  32. say "5) q1 + q2 = #{q1 + q2}"
  33. say "6) q * r = #{q * r}"
  34. say "7) q1 * q2 = #{q1 * q2}"
  35. say "8) q1q2 #{ q1*q2 == q2*q1 ? '==' : '!=' } q2q1"