newLISP FOOP 对象模型

2023-11-27 00:38
文章标签 模型 对象 newlisp foop

本文主要是介绍newLISP FOOP 对象模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


对象之间的关系

对象可以包含对象,就像一般面向对象的对象树一样。在lisp中,其实很简单, 因为对象就是list, 对象包含对象也就是list里面包含list,此嵌套关系可以有很多层。

下面这个例子同样来自manual

; create classes
(new Class 'Person)
(new Class 'Address)
(new Class 'City)
(new Class 'Street); create an object containing other objects
(set 'JohnDoe (Person (Address (City "Boston") (Street 123 "Main Street"))))
→ (Person (Address (City "Boston") (Street 123 "Main Street")))


类的继承

可以用new来创建某个类的子类

比如下面的代码:

> (new Class 'Bird)
Bird
> (new Bird 'Hawk)
Hawk


Hawk是Bird的子类,但是注意,这种继承关系非常弱。如果现在为Bird添加方法fly,Hawk是不知道的,除非你再次用new。
> (define (Bird:fly) (println "bird fly"))
(lambda () (println "bird fly"))
> (Hawk:fly)ERR: invalid function : (Hawk:fly)
> (Bird:fly)
bird fly
"bird fly"
> (new Bird 'Hawk true)
Hawk
> (Hawk:fly)
bird fly
"bird fly"
> 

查看API文档关于new的部分,发现这种继承其实是通过复制context来实现的。因此当时复制的时候Bird还没有fly, Hawk也就没有。Bird后来添加了fly方法,必须再次用new来复制一次。true参数强制用Bird的symbol覆盖原来Hawk中同名的symbol.


用FOOP构造大型程序

1. 首先是分模块编写,将类的代码按照context的写法放到不同的文件中,此举和写context没太大区别,不过在创建symbol前用类名加冒号前缀。

2. 在调用代码的地方,要用(new Class ..来创建类,之后就可以用前面介绍的调用类的方法。下面的例子来自于manual

这是调用代码:

; file MAIN.lsp - declare all classes used in MAIN(new Class 'Rectangle)
(new Class 'Circle); start up code(load "Rectangle.lsp")
(load "Circle.lsp"); main control code; end of file
Rectangle和Circle都放在各自的lsp文件中:
; file Rectangle.lsp - class methods for rectangles(context Rectangle)(define (Rectangle:area)
(mul (self 3) (self 4)))(define (Rectangle:move dx dy)
(inc (self 1) dx) 
(inc (self 2) dy)); end of file

; file Circle.lsp - class methods for circles(context Circle)(define (Circle:area)(mul (pow (self 3) 2) (acos 0) 2))(define (Circle:move dx dy)(inc (self 1) dx) (inc (self 2) dy)); end of file


有一段视频介绍了FOOP,链接地址:http://neglook.com/movies/what-the-foop-H264.mov







这篇关于newLISP FOOP 对象模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/426599

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo