Defining aliases to standard Common Lisp functions?

自闭症网瘾萝莉.ら 提交于 2019-12-01 04:00:49

问题


Lisp is said to enable redefinitions of its core functions. I want to define an alias to the function cl:documentation function, such that

(doc 'write 'function) === (documentation 'write 'function)

How can this be done and made permanent in SBCL?


回答1:


Creating an Alias

You are not trying to redefine (i.e., change the definition of) the system function documentation, you want to define your own function with a shorter name which would do the same thing as the system function.

This can be done using fdefinition:

 (setf (fdefinition 'doc) #'documentation)

How to make your change "permanent" in common lisp

There is no standard way, different implementation may do it differently, but, generally speaking, there are two common ways.

Add code to an init file - for beginners and casual users

  • SBCL
  • CLISP
  • Clozure
  • ECL

The code in question will be evaluated anew every time lisp starts.

Pro:

  • Easy to modify (just edit file)
  • Takes little disk space
  • Normal lisp invocation captures the change

Con:

  • Evaluated every time you start lisp (so, slows start up time if the code is slow)

Save image - for heavy-weight professionals

  • SBCL
  • CLISP
  • Clozure
  • ECL - not supported

The modified lisp world is saved to disk.

Pro:

  • Start uptime is unaffected

Con:

  • Requires re-dumping the world on each change
  • Lisp image is usually a large file (>10MB)
  • Must specify the image at invocation time



回答2:


Even though @sds has already answered pretty thoroughly I just wanted to add that the utility library serapeum has defalias




回答3:


I use a simple macro for this:

(defmacro alias (to fn)
    `(setf (fdefinition ',to) #',fn))

e.g.

(alias neg -) => #<Compiled-function ... >

(neg 10) => -10

Other answers include detail about how to make this permanent.



来源:https://stackoverflow.com/questions/24252539/defining-aliases-to-standard-common-lisp-functions

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!