;;; -*- Mode:LISP; Package:(PCL LISP 1000); Base:10; Syntax:Common-lisp -*-
;;;
;;; *************************************************************************
;;; Copyright (c) 1985 Xerox Corporation.  All rights reserved.
;;;
;;; Use and copying of this software and preparation of derivative works
;;; based upon this software are permitted.  Any distribution of this
;;; software or derivative works must comply with all applicable United
;;; States export control laws.
;;; 
;;; This software is made available AS IS, and Xerox Corporation makes no
;;; warranty about the software, its performance or its conformity to any
;;; specification.
;;; 
;;; Any person obtaining a copy of this software is requested to send their
;;; name and post office or electronic mail address to:
;;;   CommonLoops Coordinator
;;;   Xerox Artifical Intelligence Systems
;;;   2400 Hanover St.
;;;   Palo Alto, CA 94303
;;; (or send Arpanet mail to CommonLoops-Coordinator.pa@Xerox.arpa)
;;;
;;; Suggestions, comments and requests for improvements are also welcome.
;;; *************************************************************************
;;; 
;;; This is the HP Common Lisp version of the file low.
;;;
;;; 

(in-package 'pcl)

  ;;   
;;;;;; Load Time Eval
  ;;
;;;
;;; #, is woefully inadequate.  You can't use it inside of a macro and have
;;; the expansion of part of the macro be evaluated at load-time its kind of
;;; a joke.  load-time-eval is used to provide an interface to implementation
;;; dependent implementation of load time evaluation.
;;;
;;; A compiled call to load-time-eval:
;;;   should evaluated the form at load time,
;;;   but if it is being compiled-to-core evaluate it at compile time
;;; Interpreted calls to load-time-eval:
;;;   should just evaluate form at run-time.
;;; 
;;; The portable implementation just evaluates it every time, and PCL knows
;;; this.  PCL is careful to only use load-time-eval in places where (except
;;; for performance penalty) it is OK to evaluate the form every time.
;;; 
;;(defmacro load-time-eval (form)
;;  `(progn ,form))
;;(defmacro load-time-eval (form)
;;   `(impl::loadtime ,form))

(defmacro load-time-eval (form)
  `(eval-when (load eval) ,form))  


;(defmacro implementation-dependent-class-of (x)
;  (or (and (null x)
;           (class-named 'null))
;      (and (stringp x)
;           (class-named 'string))
;      (and (characterp x)
;           (class-named 'character))))

  ;;   
;;;;;; Cache No's
  ;;  

;;; Grab the top 29 bits
;;;
(defmacro symbol-cache-no (symbol mask)
; `(logand (prim:@inf ,symbol) ,mask)                       ;33% hit rate
  `(logand (ash (prim:@inf ,symbol) -5) ,mask)              ;83% hit rate
; `(the extn::index (logand (prim::@>> ,symbol 4) ,mask))   ;75% hit rate
  )

(defmacro object-cache-no (symbol mask)
  `(logand (prim:@inf ,symbol) ,mask))

  ;;   
;;;;;; printing-random-thing-internal
  ;;
(defun printing-random-thing-internal (thing stream)
  (format stream "~O" (prim:@inf thing)))