]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new function 'readablep'
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 22 Jan 2022 14:11:17 +0000 (15:11 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 22 Jan 2022 14:13:27 +0000 (15:13 +0100)
* doc/lispref/streams.texi (Input Functions): Document it.
* lisp/subr.el (readablep): New function (bug#52566).

doc/lispref/streams.texi
etc/NEWS
lisp/subr.el
test/lisp/subr-tests.el

index 5ab6cf5777b76829b73f68c4c9c973370b248838..b93a7610fa02f0c964da128a92e6c1ede032a263 100644 (file)
@@ -358,6 +358,13 @@ mode for @var{stream}.  On POSIX hosts, it always returns a
 non-@code{nil} value and does nothing except flushing pending output.
 @end defun
 
+@defun readablep object
+This predicate says whether @var{object} can be written out and then
+read back by the Emacs Lisp reader.  If it can't, this function
+returns @code{nil}, and if it can, a printed representation (via
+@code{prin1}) of @var{object} is returned.
+@end defun
+
 @node Output Streams
 @section Output Streams
 @cindex stream (for printing)
index 02e7a462a189db63295a290a63b6780c40fb21c4..95e53852cea7d4bbbad953b52097c3fe56e233cf 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -977,6 +977,10 @@ functions.
 \f
 * Lisp Changes in Emacs 29.1
 
+** New function 'readablep'.
+This function says whether an object can be written out and then
+read back by the Emacs Lisp reader.
+
 +++
 ** New variable 'print-unreadable-function'.
 This variable allows changing how Emacs prints unreadable objects.
index 81c02338531cdcbe140fcbcba46befd65d5961c8..29b9b6dfcf5d3a5e72776be6b16dd78126822393 100644 (file)
@@ -6561,4 +6561,17 @@ signalled.  If NOERROR, the non-loop parts of the chain is returned."
          (push func chain))
        chain))))
 
+(defun readablep (object)
+  "Say whether OBJECT has a readable syntax.
+This means that OBJECT can be printed out and then read back
+again by the Lisp reader.  This function returns nil if OBJECT is
+unreadable, and the printed representation (from `prin1') of
+OBJECT if it is readable."
+  (declare (side-effect-free t))
+  (catch 'unreadable
+    (let ((print-unreadable-function
+           (lambda (_object _escape)
+             (throw 'unreadable nil))))
+      (prin1-to-string object))))
+
 ;;; subr.el ends here
index 512b65453554a3be304c3f76ece4a7e3c74864c7..e027c68d0b2085a5511e5e4c9349c993a03faa44 100644 (file)
@@ -1024,5 +1024,9 @@ final or penultimate step during initialization."))
   (should (equal (function-alias-p 'subr-tests--d t)
                  '(subr-tests--e))))
 
+(ert-deftest test-readablep ()
+  (should (readablep "foo"))
+  (should-not (readablep (list (make-marker)))))
+
 (provide 'subr-tests)
 ;;; subr-tests.el ends here