Commit Graph

23 Commits

Author SHA1 Message Date
36e7b750ce refactor: Make generics more strict via templates
This commit also adds a built-in `typeOf` function to every PocomathInstance.
  It also adds a notation (prefix '!') for "eager" templeates that
  instantiate themselves for all types immediately upon definition.
2022-08-01 03:02:38 -07:00
fd3d6b2eb3 feat: Template implementations 2022-07-31 23:33:58 -07:00
1076c3c727 feat: add built-in typeOf operator to PocomathInstance 2022-07-31 21:26:16 -07:00
7bbdc049ce refactor: add stub for patch to generic template behavior 2022-07-31 21:08:28 -07:00
171b6941f4 refactor: add stub for instantiating the template 2022-07-31 11:10:41 -07:00
5cea71cb25 refactor: isolate in the code the point of template instantiation 2022-07-31 11:10:41 -07:00
0fbcbf661e refactor: separate the generation of a typed-function implementation 2022-07-31 11:10:41 -07:00
5c3716ff99 refactor: Avoid use of a "magic string " 'T' 2022-07-31 11:10:41 -07:00
d4a4d8f331 refactor: track all the 'prior types' of a type as types are installed
These are exactly the types that might match before the given type, and
  hence which require to have their template instantiations defined when
  an instantiation with the given type is made.
2022-07-31 11:10:41 -07:00
883a351aa8 refactor: Add stubs for function templates
The stubs are so far all no-ops so basically at the moment the only
  allowed template parameter 'T' is just a synonym for 'any'. But at least
  this allows us to put the definition of the generic `subtract` into
  the exact form we actually want to support.
2022-07-31 11:10:41 -07:00
102a7c42dc feat(Complex): support division 2022-07-31 11:08:07 -07:00
c429c19dfe feat: Implement subtypes
This should eventually be moved into typed-function itself, but for
  now it can be implemented on top of the existing typed-function.

  Uses subtypes to define (and error-check) gcd and lcm, which are only
  defined for integer arguments.

  Resolves #36.
2022-07-30 04:59:04 -07:00
81127b8a9b test: Check for undefined types, as a means to detect typos in type names 2022-07-29 19:43:24 -07:00
d9d7af961f refactor: Simpler merging mechanism
Merging of Pocomath modules is eased by allowing one PocomathInstance to
  be merged into another. That allows types, for example, to be exported
  as a PocomathInstance (so there is no need for a special identifier
  convention for types; they can be directly added with an installType
  method). Also, larger modules can just be exported as an instance, since
  there is more flexibility and more checking in merging PocomathInstances
  than raw modules.
2022-07-27 22:28:40 -07:00
f68c7bd1fb fix(Types): Move distinct types into distinct identifiers
This allows types to be collected; prior to this commit they
   were conflicting from different modules.

   Uses this fix to extend sqrt to bigint, with the convention
   that it is undefined for non-perfect squares when 'predictable'
   is false and is the "best" approximation to the square root when
   'predictable' is true. Furthermore, for negative bigints, you might
   get a Gaussian integer when predictable is false; or you will just get
   your argument back when 'predictable' is true because what other
   bigint could you give back for a negative bigint?

   Also had to modify tests on the sign in sqrt(Complex) and add functions
   'zero' and 'one' to get types to match, as expected in #27.

   Adds numerous tests.

   Resolves #26.
   Resolves #27.
2022-07-25 11:56:12 -07:00
91ec20edd8 feat: Implement signature-specifc reference
Also implements a config object that upon change, lazily invalidates
  all operations that access it.

  Also allows references to signatures with nonexistent types (which
  typed-function does not); they come back as undefined.

  Uses these features to implement sqrt for number and complex.

  Resolves #7.
2022-07-25 04:20:13 -07:00
358f68fbbd feat(Types): Improve type spec and ignore signatures that use unknown type 2022-07-24 12:52:23 -07:00
9fb3aa2959 feat: Switch to function-based specification of dependencies
Allows dependencies to be economically expressed and used.
  For example, see the new definition of subtract.
  Credit for the basic idea goes to James Drew, see
  https://stackoverflow.com/a/41525264

  Resolves #21.
2022-07-23 09:55:02 -07:00
d72c443616 feat: Add and illustrate multiple ways of specifying implementations (#19)
Resolves #9.

Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Reviewed-on: #19
2022-07-23 05:06:48 +00:00
4fdafc751e feat: Add a couple of ways to install generics safely. (#18)
Resolves #10.

Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Reviewed-on: #18
2022-07-23 02:41:59 +00:00
e6699ce642 refactor: Use Object.defineProperty with a getter to invalidate
Rather than setting a dummy function; this avoids anyone ever storing
  a dummy function.

  Resolves #8.
2022-07-22 15:06:56 -07:00
b72212d929 fix: Prevent PocomathInstance from clobbering its own methods
Resolves #6.
2022-07-22 14:25:26 -07:00
0069597a76 fix: Separate typed instance for each PocomathInstance (#15)
Also starts each PocomathInstance with no types at all, and uses the new
  situation to eliminate the need for a Complex "base case".

  Resolves #14.
  Resolves #13.

Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Reviewed-on: #15
2022-07-22 20:49:14 +00:00