procedures.scm 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. ;;; Procedures on procedures
  2. ;;; Copyright (C) 2023, 2024 Igalia, S.L.
  3. ;;; Copyright (C) 2023 Robin Templeton <robin@spritely.institute>
  4. ;;;
  5. ;;; Licensed under the Apache License, Version 2.0 (the "License");
  6. ;;; you may not use this file except in compliance with the License.
  7. ;;; You may obtain a copy of the License at
  8. ;;;
  9. ;;; http://www.apache.org/licenses/LICENSE-2.0
  10. ;;;
  11. ;;; Unless required by applicable law or agreed to in writing, software
  12. ;;; distributed under the License is distributed on an "AS IS" BASIS,
  13. ;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. ;;; See the License for the specific language governing permissions and
  15. ;;; limitations under the License.
  16. ;;; Commentary:
  17. ;;;
  18. ;;; procedure?
  19. ;;;
  20. ;;; Code:
  21. (library (hoot procedures)
  22. (export procedure? procedure-name)
  23. (import (only (hoot primitives) %procedure?)
  24. (hoot cond-expand)
  25. (hoot errors)
  26. (hoot inline-wasm)
  27. (hoot syntax))
  28. (define (procedure? x) (%procedure? x))
  29. (cond-expand
  30. (guile-vm
  31. (define (procedure-name proc)
  32. (check-type proc procedure? 'procedure-name)
  33. #f))
  34. (hoot
  35. (define (procedure-name proc)
  36. (check-type proc procedure? 'procedure-name)
  37. (%inline-wasm
  38. '(func (param $proc (ref $proc)) (result (ref eq))
  39. (local $maybe-string (ref null string))
  40. (call $code-name (struct.get $proc $func (local.get $proc)))
  41. (local.set $maybe-string)
  42. (if (ref eq)
  43. (ref.is_null (local.get $maybe-string))
  44. (then (ref.i31 (i32.const 1)))
  45. (else (struct.new $string (i32.const 0)
  46. (ref.as_non_null (local.get $maybe-string))))))
  47. proc)))))