Skip to content

Instantly share code, notes, and snippets.

@ApolloZhu
Last active May 20, 2019 06:35
Show Gist options
  • Save ApolloZhu/a050e64281f4d47a8af44c153ff9da37 to your computer and use it in GitHub Desktop.
Save ApolloZhu/a050e64281f4d47a8af44c153ff9da37 to your computer and use it in GitHub Desktop.
ACSL 版 LISP 语法总结(2018-04-26)

因为没有看过 LISP 官方的文档,ACSL的文档从来都是讲的不明不白,我也只能总结规律,如有不妥,希望大家指正。

LISP 是一种函数式编程语言,里面只有两种数据结构——原子和表。所谓的表,其实就是操作符(函数)、表和原子的集合。

NIL 是一个特例,它既是原子又是表,所以 ’() 也表示空。

表示在被传入到操作符的是值,列表或是字符串,而不是变量。数字前面不要求加上。这同时也可用 (quote variable) 来表示

之后所有的 LISP 函数都会被用 Swift 重现,下面的是可有可无的定义。

typealias Atom = Any?
typealias List = Array<Atom | List>
let NIL: List = []

我们假设可以用 List<T> 来改写定义。

操作符

  • ( QUOTE variable )

用于返回非变量

func QUOTE(variable: Any) -> Atom {
    return "\(variable)"
}
  • ( SET variable value )
  • ( SETQ variable value )

设置 variable 的值为 value

SETQ 的 variable 前面不需要加

func SET(inout variable: Any, value: Any) {
    variable = value
}
  • ( ADD value… )

将所有的 value 相加

func ADD(value: Number) -> Number {
    return value.reduce(0, combine: +)
}
  • ( EVAL variable )

感觉和直接打印没设么区别,倒是可以明白 quote 的用法。

func EVAL<T>(variable: T) -> T {
    return variable
}
  • ( ATOM variable )

如果 variable 是原子,则返回 true,否则返回 NIL

func ATOM(variable: Any?) -> Bool? {
    if variable == nil || variable is Atom {
        return true
    }
    return nil
}
  • ( REVERSE list )

将反转表里面的原子的顺序

func REVERSE(inout list: List) {
    list = list.reverse()
}
  • ( CAR list )

返回列表中的第一个项目。如果传入的不是表的话自动 error

func CAR<T>(list: List<T>) -> T {
    if let item = list.first {
        return item
    } else {
        fatalError("NIL")
    }
}
  • ( CDR list )

返回列表中除了第一个之外的项目

func CDR<T>(list: List<T>) -> List<T> {
    if list.count > 1 {
        return Array(list.dropFirst())
    }
    fatalError("NIL")
}
  • ( CONS arg1 arg2 )

返回由 arg1 和 arg2 组成的表

func CONS(arg1: Atom, arg2: List) -> List {
    return [arg1] + arg2
}

数学运算符

这个,就不讲解了

ADD:    return args.reduce(0, combine: +)
MULT:   return args.reduce(1, combine: *)
SUB:    return $0 - $1
DIV:    return $0 / $1
SQUARE: return pow($0, 2)
EXP:    return pow(a,n)
EQ:     return $0 == $1 ? true : NIL
POS:    return $0 > 0 ? true : NIL
NEG:    return $0 < 0 ? true : NIL

自定义函数

  • ( DEF name(parameter) alreadyDefinedFunction(parameter) )

这个还是举个例子好了

(DEF SECOND(parms) (CAR (CDR parms)))

这个可以求表的第二个项

调用的话和以前一样,就是 (SECOND ’(1 2))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment