diff --git a/guix/inferior.scm b/guix/inferior.scm
index da6983d9a6..6933a38d15 100644
--- a/guix/inferior.scm
+++ b/guix/inferior.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -44,6 +44,7 @@
   #:use-module (guix store)
   #:use-module (guix derivations)
   #:use-module (guix base32)
+  #:use-module ((guix memoization) #:select (mlambdaq))
   #:use-module (gcrypt hash)
   #:autoload   (guix cache) (maybe-remove-expired-cache-entries
                              file-expiration-time)
@@ -384,9 +385,10 @@ record."
                                              loc)))
                                      package-location))))
 
-(define (inferior-package-input-field package field)
+(define (inferior-package-input-field field)
   "Return the input field FIELD (e.g., 'native-inputs') of PACKAGE, an
 inferior package."
+  (mlambdaq (package)
     (define field*
       `(compose (lambda (inputs)
                   (map (match-lambda
@@ -415,23 +417,24 @@ inferior package."
             `(,label ,(inferior-package inferior name version id)
                      ,@rest))
            (x x))
-       inputs))
+         inputs)))
 
 (define inferior-package-inputs
-  (cut inferior-package-input-field <> 'package-inputs))
+  (inferior-package-input-field 'package-inputs))
 
 (define inferior-package-native-inputs
-  (cut inferior-package-input-field <> 'package-native-inputs))
+  (inferior-package-input-field 'package-native-inputs))
 
 (define inferior-package-propagated-inputs
-  (cut inferior-package-input-field <> 'package-propagated-inputs))
+  (inferior-package-input-field 'package-propagated-inputs))
 
 (define inferior-package-transitive-propagated-inputs
-  (cut inferior-package-input-field <> 'package-transitive-propagated-inputs))
+  (inferior-package-input-field 'package-transitive-propagated-inputs))
 
-(define (%inferior-package-search-paths package field)
+(define (%inferior-package-search-paths field)
   "Return the list of search path specifications of PACKAGE, an inferior
 package."
+  (mlambdaq (package)
     (define paths
       (inferior-package-field package
                               `(compose (lambda (paths)
@@ -440,16 +443,16 @@ package."
                                                paths))
                                         ,field)))
 
-  (map sexp->search-path-specification paths))
+    (map sexp->search-path-specification paths)))
 
 (define inferior-package-native-search-paths
-  (cut %inferior-package-search-paths <> 'package-native-search-paths))
+  (%inferior-package-search-paths 'package-native-search-paths))
 
 (define inferior-package-search-paths
-  (cut %inferior-package-search-paths <> 'package-search-paths))
+  (%inferior-package-search-paths 'package-search-paths))
 
 (define inferior-package-transitive-native-search-paths
-  (cut %inferior-package-search-paths <> 'package-transitive-native-search-paths))
+  (%inferior-package-search-paths 'package-transitive-native-search-paths))
 
 (define (inferior-package-provenance package)
   "Return a \"provenance sexp\" for PACKAGE, an inferior package.  The result
@@ -639,11 +642,19 @@ failing when GUIX is too old and lacks the 'guix repl' command."
 ;;; Manifest entries.
 ;;;
 
-(define* (inferior-package->manifest-entry package
-                                           #:optional (output "out")
+(define inferior-package->manifest-entry
+  (let ((results vlist-null))
+    (lambda* (package #:optional (output "out")
                       #:key (parent (delay #f))
                       (properties '()))
       "Return a manifest entry for the OUTPUT of package PACKAGE."
+      (define key package)
+      (or (and=> (vhash-assoc key results)
+                 (lambda (result)
+                   (pk 'mem package)
+                   (cdr result)))
+          (begin
+            (pk 'compute package)
             ;; For each dependency, keep a promise pointing to its "parent" entry.
             (letrec* ((deps  (map (match-lambda
                                     ((label package)
@@ -663,7 +674,8 @@ failing when GUIX is too old and lacks the 'guix repl' command."
                                 (inferior-package-transitive-native-search-paths package))
                                (parent parent)
                                (properties properties))))
-    entry))
+              (set! results (vhash-cons key entry results))
+              entry))))))
 
 
 ;;;

Generated by Ricardo Wurmus using scpaste at Fri Jan 22 22:07:13 2021. CET. (original)