POSTSCRIPT语言中有许多操作符用于制定程序内流的控制。我们在前一章使用了一个repeat运算。所有的控制操作符都使用了之前简要提到的对象类型,即函数,用于我们调用。

7.1、函数

函数(既过程)是一个数组,其内容由解析器执行。

当解析器在程序中遇到一系列对象(值和名称)时,它执行与这些指令相应的操作,将对象放在堆栈上,查找和执行操作符和过程。

但是如果一系列对象用括号括起来,则不会立即执行,而是放在堆栈上。

86 23 add

该行使解析器将数字86和23相加

{86 23 add}

当执行置放时,操作符添加一个程序块,然后放在堆栈上,函数通常跟字面名称,后边跟def运算符,def运算符将其与当前所保存的名称相连(这就是函数的定义)。  

7.2、条件语句

7.2.1、比较

POSTSCRIPT提供了一套比较完整额比较运算符,这些比较栈上的前两个项目,可以是任何类型,返回一个布尔类型的对象在堆栈上。他们的等效数学符号为:

eq =;  ne ≠;  gt >;  lt <;  ge ≥; le≤;

7.2.2、if

例:检查是否到达当前行的末尾

/chkforendofline
{ currentpoint pop %获取x的位置
612 gt %是否大于612
{0 -12 translate 0 0 moveto} if
}def

执行取出当前的x,比较看是否大于612(即本行的末尾),如果大于,则将原点移动到下一行的开头,当前点移动到原点的位置。

编写一个程序,对字符串进行简单的格式打印:检查该字符串的长度是否适合当前行,如果不适合,则移动到新的行,然后进行打印。

在这里定义了三个变量:左边距,右边距,当前文本的垂直位置,以及单独文本的垂直距离。

首先复制要打印的字符串,然后使用stringwith计算其长度,然后取出当前的x的位置,将两个值相加,看是否大于右边沿,如果大于,跳转到下一行进行打印。

% -------------- Variables ---------------
/LM 72 def %定义左边沿
/RM 216 def %定义右边沿
/ypos 720 def %当前文本的垂直位置
/lineheight 14 def %一行字符的高度
% of text % ------------- Procedures ---------------
/newline %跳转倒下一行
{ ypos lineheight sub %720 - 14 即为下一行的垂直位置
/ypos exch def %将当前文本的垂直高度刷新为新的值
LM ypos moveto } def %将当前点移动到新的起始点 /prtstr %打印字符串
{ dup stringwidth pop %取出打印的字符串的宽度
currentpoint pop %取出当前画笔x的位置
add RM gt %相加看是否大于右边距
{newline} if %条件符合,跳转到下一行
show } def %进行打印 %------------- Main Program --------------
/Times-Italic findfont 13 scalefont setfont LM ypos moveto
(If ) prtstr (you ) prtstr (tell ) prtstr
(the ) prtstr (truth, ) prtstr (you ) prtstr
(don’t ))prtstr (have ) prtstr (to ) prtstr
(remember ) prtstr (anything. ) prtstr
(- Mark ) prtstr (Twain ) prtstr
showpage

7.2.3、ifelse

这个运算符需要堆栈上有三个对象:一个布尔值和两个执行语句。

如果为真,则执行第一个,否则执行第二个。

bool {op1} {op2} ifelse

例:使用ifelse生成了一组灰度交替逐渐减少高度的重叠梯形。

% ------- Variables & Procedures ---------
/scalefactor 1 def /counter 0 def /DecreaseScale
{ scalefactor .2 sub
/scalefactor exch def } def /IncreaseCounter
{ /counter counter 1 add def } def /trappath
{ 0 0 moveto 90 0 rlineto
-20 45 rlineto -50 0 rlineto
closepath } def /doATrap
{ gsave %保存当前环境
1 scalefactor scale %设置当前坐标轴的压缩比例
trappath %绘制梯形
counter 2 mod %取余(看是否能被2整除)
0 eq {.5} {0} ifelse
setgray fill %设置灰度,然后进行填充
grestore } def %恢复环境 % ------------ Begin Program ----------
250 350 translate 5
{ IncreaseCounter %标记当前的次数
doATrap %绘制梯形
DecreaseScale %标记当前的坐标轴y的压缩比例
0 20 translate %每次将原点向上移动20个单位
} repeat
showpage

7.3、循环

在POSTSCRIPT中有三个操作符用来建立和控制循环程序。我们已经使用过repeat操作。

7.3.1、for

这个运算符实现了计数循环。该操作符需要四个对象:

起始值、地增量、最终值、重复的过程。

for操作在每次执行过程之前将计数器的当前值放在堆栈上。

例:将字幕k在页面上每12个单元打印一次,

/Times-Italic findfont 10 scalefont setfont

100 100 translate

0 12 600 {0 moveto (k) show } for

showpage 

数字的变化不一定是整数,例如打印一个zip字符出现阴影效果

/Times-Italic findfont 30 scalefont setfont

/printZip
{ 0 0 moveto (Zip) show} def
320 400 translate .95 -.05 0
{ setgray
printZip
-1 .5 translate } for 1 setgray printZip showpage

7.3.2、loop,exit

许多程序需要重复一个不确定的数目,一段时间或者永远,或者满足某种条件,这时候就要用到重复。。。直到。。。这种。

POSTSCRIPT提供了一对运算符:loop,exit。

loop操作符重复执行其过程,直到遇到退出条件。退出导致程序离开包含该操作符的最内层循环。退出操作符还会终止for,repeat,forall操作符启动的循环。

例:此程序无限打印howdy。

{(Howdy ) show} loop

例:为了了解loop-exit如何一起工作,以下程序在当前页面绘制了几个圆  

/pagewidth 8.5 72 mul def

/doCircle
{ xpos ypos radius 0 360 arc stroke} def /increase-x
{ xpos radius add
/xpos exch def } def /lineofcircles %stack: radius y
{ /ypos exch def
/radius exch def
/xpos 0 def
{ xpos pagewidth le
{doCircle increase-x}
{exit} ifelse
}loop
} def % --------------- Begin Program -----------
10 400 lineofcircles
30 400 lineofcircles
90 400 lineofcircles
showpage

  

  

  

  

 

 

PostScript语言教程(七、条件语句)的更多相关文章

  1. 单片机c语言教程:C51循环语句

    单片机c语言教程第十三课 C51循环语句 循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 ...

  2. Java入门 - 语言基础 - 10.条件语句

    原文地址:http://www.work100.net/training/java-if-else.html 更多教程:光束云 - 免费课程 条件语句 序号 文内章节 视频 1 概述 2 if...e ...

  3. go语言练习:条件语句和循环语句

    1.for循环+if条件语句简单例子: package main import "fmt" func main() { var a int for a = 0; a <= 2 ...

  4. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等

    [源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native  ...

  5. (旧)子数涵数·C语言——条件语句

    首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构.条件结构.循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了. 而条件语句便是控制语 ...

  6. Go 语言条件语句

    条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...

  7. 2018-02-18 Antlr4实现简单语言之条件语句

    本系列之前的文章: Antlr4的分析错误处理 Antlr4实现数学四则运算 Antlr4添加中文变量赋求值,括号,各种问题 Antlr4: 修改语法规则更接近普通BNF格式 Antlr4实现简单语言 ...

  8. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  9. shell基础(七)-条件语句

    条件语句在编写脚本经常遇到:用于处理逻辑问题. 一 IF 语句 if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句 ...

  10. Go语言【第五篇】:Go条件语句

    Go语言条件 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为true来决定是否执行指定语句,并在条件为false的情况再执行另外的语句.下图展示了程序语言中条件语句的结构: Go语言提 ...

随机推荐

  1. Firefox彻底禁用自动更新提示

    实验版本:96 安装目录下新建文件夹:distribution 新建文件:policies.json 文件内容为: { "policies": { "DisableApp ...

  2. java开发微信APP支付

    直接上代码 String nonce_str=WXPayUtil.generateNonceStr(); //WXPayUtil微信自己有的,自己下载,这里是生成随机字符串,下载地址(下载java的里 ...

  3. typora文件中不显示公式

    行内公式在typora中不显示 解决办法 打开typora--文件(F)--偏好设置--markdown--内联公式--打勾选中 若改后没有反应,关闭重新打开.

  4. GIT Authentication failed for错误问题处理

    1. Settings ==> Developer settings ==> Personal access tokens ==> Generate new token   生成新的 ...

  5. 摄像头的MIPI接口、DVP接口和CSI接口

    电脑摄像头接口是USB接口,智能手机的摄像头接口是MIPI接口,还有一部分的摄像头(比如说某些支持DVP接口的硬件)是DVP接口. USB是串行通用串行总线(Universal Serial Bus) ...

  6. springcloud(六) - 配置中心

    功能介绍 设置和业务代码获取配置 功能实现 <!-- 添加configjar --> <dependency> <groupId>org.springframewo ...

  7. 计算机科学导论-第三版-学习笔记-chapter2-数字系统

    原本看答案的网站被上保护了,我没账号看不了,开摆. 猜测是那边的学生做作业用chatGPT,部分教师觉得不行,禁止使用的同时把答案都上锁了. 也可能是单纯因为我没报课就没账号. 复习题 1.定义一个数 ...

  8. C++11 变长参数模板 & 如何展开变长参数

    https://blog.csdn.net/CodeBowl/article/details/119902935 通过typename ... Args指定变长参数. 通常通过递归展开各个参数, 使用 ...

  9. The first python article

    Smile is the most beautiful language! and Python so on !

  10. R语言Apriori关联规则、kmeans聚类、决策树挖掘研究京东商城网络购物用户行为数据可视化|附代码数据

    全文链接:http://tecdat.cn/?p=30360 最近我们被客户要求撰写关于网络购物用户行为的研究报告,包括一些图形和统计输出. 随着网络的迅速发展,依托于网络的购物作为一种新型的消费方式 ...