什么是Scheme?原来还可以这样应用!

本文介绍Scheme编程语言的特点及应用,特别是其在一键跳转功能中的使用,通过URLScheme和UniversalLinks技术,实现不同浏览器中唤醒APP并传递自定义参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scheme定义

Scheme 编程语言是一种Lisp方言,诞生于1975年,由 MIT 的 Gerald J. Sussman 和 Guy L. Steele Jr. 完成。它是现代两大Lisp方言之一;另一个方言是Common Lisp

Scheme遵循极简主义哲学,以一个小型语言核心作为标准,加上各种强力语言工具(语法糖)来扩展语言本身。

MIT曾用Scheme作为计算机系入门课程的编程语言。计算机程序语言界著名的魔法书《计算机程序的构造和解释》(又称SICP)正是利用Scheme来解释程序设计。

历史悠久的Scheme依然活跃,拥有针对各种计算机平台和环境的实现,例如RacketGuile、MIT Scheme、Chez Scheme等。Guile是GNU工具体系里最重要的部件之一,被许多自由软件和开源软件作为内置脚本语言使用。

历史与特点:

Lisp 语言历史悠久,在计算机程序语言里,年龄仅次于Fortran。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算,由MIT 的John McCarthy于1960年开发出了Lisp (list processing)语言。该语言起初为表处理而设计,后来广泛用于人工智能。Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现了递归。1994年时众多Lisp版本得到了相当的统一,统一之后的版本称为Common LISPCommon Lisp带有庞大的函数库,语言的规范长达千页以上,包括面向对象的 CLOS。

Scheme语言的规范很短,总共只有50页,甚至连Common Lisp 规范的索引的长度都不到,但是却被称为是现代编程语言王国的皇后。它与以前和以后的 Lisp 实现版本都存在一些差异。现特征如下:

(1)括号嵌套:Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号体现了最基本的数学思想——递归

(2)语法简洁:Scheme语言的规范很短,总共只有50页。

(3)函数编程语言

一个函数(Function)是这个编程语言中所谓的第一等的公民。也就是说函式可以像一个 int 或者 float 一样被很方便的传递来传递去。这也就是所谓“Functional编程语言”中,Functional 一词的由来。

(4)自动内存管理

(5)支持尾递归:提高了递归效率

(6)continuation

(7)可移植性好

Scheme开发的程序有很好的可移植性,这是由于Scheme在不同的计算机平台有相应的解释器和编译器。

(8)脚本语言

由于scheme语法简洁,一个Scheme解释器可以非常的小巧。Scheme可以作为脚本语言而内嵌于一些工具之中。

(9)数据结构

I.数字

下面都是合法的数字表示方法:47,1/3,2.3,4.3e14,1+3i。

II.字符

字符前面需要用#\做前缀。如下面都是合法字符:#\a #\A #\b #\B #\space #\newline

III.字符串:由双引号括起来的字符组成字符串。如:"A little string"

IV布尔值:布尔值True和False分别用 #t 和 #f 表示。

V.列表:用圆括号括起来的,可以包含任何数据类型的称为列表。如:(a little (list of) (lists))

VI.数组(vector):用#为前缀,如:#(1 2 "string" #\x 5)

VII.函数(或称为过程):把函数作为一种数据类型,是包括Scheme语言在内的Lisp的特色。

VIII.符号

符号除了不能够以数字开头的任何字符可组成符号。如:Symbols: this-is-a-symbol foo a32 c$23*4&7+3-is-a-symbol-too!

IX.注释 分号开始一行注释。 如:(+ 3 1) ;return 4

Scheme应用实例

今天小编给大家讲解的这个例子是关于shareinstall的。我们知道,Shareinstall其实是一个APP的推广辅助工具,它主要的作用就是进行渠道统计。另外,它还提供了免填二维码、一键跳转、自动渠道打包、自动建立社区关系等功能。而scheme语言主要应用在一键跳转功能上。

以IOS SDK为例,ShareInstall通过标准的scheme、universal link等技术,在app安装的情况下,从各种浏览器(微信、QQ、新浪微博、钉钉等主流社交软件的内置浏览器)唤醒 app 并传递自定义参数,避免重复安装。

我们可以从universal link配置作为载体,去观察scheme的活跃性。如下:

Universal link是iOS9的一个新特性,通过Universal link,App可以通过各种浏览器跳转到App(例如微信内可不通过safari,一键跳转到App),真正实现一键跳转到相应界面。 备注:iOS9以上推荐使用Universal link。

(1)配置developer.apple.com的相关信息 

到苹果开发者中心,为当前的App ID开启Associated Domains服务: 

(2)配置Xcode

在Xcode中配置ShareInstall为当前应用生成的关联域名:Associated Domains 开关打开,添加 Domains:applinks:f6bkarebhf22eb.shareinstall.com

 在AppDelegate中的continueUserActivity方法中调用,用来处理Universal link。

//Universal Links 通用链接
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    //判断是否通过ShareInstall Universal Links 唤起App
    if ([ShareInstallSDK continueUserActivity:userActivity]) {
        return YES ;
    }else{
        //其他代码
        return YES;
    }
}

(3)配置App的URL Scheme

iOS系统中App之间是相互隔离的,通过URL Scheme, App之间可以相互调用,并且可以传递参数。 备注:iOS9以下通过Url Scheme实现拉起。

(4) 在Xcode里选中Target—Info—URL Types, 配置shareInstall为当前应用生成的Url Scheme,如图所示:

identifier 配置为 com.ShareInstall,URL Schemes从shareInstall获取(dekf0466)。 注:identifier 一定要配置为com.ShareInstall 

(5) URL Scheme相关代码配置

注意:当需要在shareInstall这个方法中处理第三方回调的时候(比如支付宝、微信回调等),请注意区分。

//iOS9以下 URI Scheme
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

    //判断是否通过ShareInstall URL Scheme 唤起App
    if ([ShareInstallSDK handLinkURL:url]) {
         return YES;
    }else{
        //其他代码
        return YES;
    }

    return YES;
}

//iOS9以上 URL Scheme
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(nonnull NSDictionary *)options
{
    //判断是否通过ShareInstall URL Scheme 唤起App
    if ([ShareInstallSDK handLinkURL:url]) {

        return YES;
    }else{
        //其他代码
        return YES;
    }

    return YES;
}

(6)获取唤醒参数,直达具体页

通过在url中附带具体的参数,唤醒app并跳转到具体页。

- (void)getWakeUpParamsFromSmartInstall: (id) params withError: (NSError *) error{
NSLog(@"唤醒参数params=%@",params);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL shceme 进来的" message:[self DataTOjsonString:params] delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
//弹出提示框(便于调试,调试完成后删除此代码)
[alert show];
}

(7) 其他代码配置

如果做测试,获取参数,则必须在Appdelegate.h加上如下测试代码。

#pragma mark 将oc数据类型转成NSString
-(NSString *)DataTOjsonString:(id)object
{
    if (!object) {
        return null;
    }

    NSString *jsonString = null;
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];
    if (! jsonData) {
        NSLog(@"Got an error: %@", error);
    } else {
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    return jsonString;
}

一键跳转的优势

通过 URL Scheme 和 Universal Links 实现了在不同浏览器中拉起APP。这样Shareinstall SDK就减少了应用的代码冗余,提供了通用的一键拉起接口,使用户有了更加舒适的体验,同时给移动开发者对自己产品的管理和推广,也提供了便利。

 

### 应用开发中 Scheme 的概念及用法 #### 什么是 SchemeScheme 是一种基于 Lisp 的函数式编程语言,具有简洁的设计哲学和强大的抽象能力。它最初由 Guy L. Steele 和 Gerald Jay Sussman 开发,并成为学术界研究函数式编程的重要工具之一。随着其发展,Scheme 不断引入新的标准来增强其实用性和可移植性。 在应用开发领域,Scheme 可以被用于多种用途,包括但不限于脚本编写、嵌入式系统开发以及作为 URI Scheme 来调用本地程序[^2]。 --- #### Scheme 在 Web 页面上的使用 通过定义自定义的 URI Scheme(如 `myapp://`),可以在浏览器环境中触发特定的操作,比如启动本地 C++ 或其他类型的桌面应用程序。这种方式通常涉及以下几个方面: 1. **注册自定义协议** 需要在操作系统层面配置该协议对应的执行文件路径。例如,在 Windows 平台下可以通过修改注册表项完成此设置。 2. **传递参数给目标应用** 当用户点击链接时,URL 中附加的数据会被解析并传送给指定的应用程序进行进一步处理。这允许开发者构建复杂的交互逻辑而无需额外依赖第三方服务端组件[^4]。 3. **跨平台支持考量** 虽然理论上任何现代主流浏览器都应能识别合法的标准 URL 架构形式下的请求动作;然而实际部署过程中仍需注意各操作系统的差异可能带来的兼容性挑战。 --- #### 数学运算与数据处理强化 除了充当桥梁角色连接前后两端之外,最新版 Scheme 标准还增强了内置模块的功能集范围——特别是针对数值分析方面的改进尤为显著[^3]。这些新增特性让程序员能够在不借助外部插件的情况下轻松应对诸如矩阵变换之类的高级课题需求。 以下是利用 Guile-Scheme 实现简单线性代数例子的小片段展示如何创建二维向量对象及其基本加减乘除运算过程: ```scheme (define (make-vector x y) (list 'vector x y)) (define v1 (make-vector 3 4)) (define v2 (make-vector (- 7)(* pi))) ; 加法 (+vectors v1 v2) ; 减法 (-vectors v1 v2) ``` 以上代码段展示了两个矢量相加/差的过程演示。 --- #### 总结 综上所述,无论是作为一种通用目的的语言还是专门服务于某些特殊场合的角色扮演者身份来看待,“Scheme”的身影总是活跃于众多技术栈之中发挥着不可替代的作用价值所在之处即为其存在意义之所系也[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值