Submitted by liuguangzhao on Sun, 2008-07-13 20:51
QSplitter是一个可包含其他物件的物件。在分隔条中的物件被分隔手柄分开。用户可拖动手柄改变分隔条中的子物件的尺寸。分隔条经常被用作一种布局管理器的替代,以给用户更多的控制。
一个QSplitter的子物件被以它们被创建的顺序并排(或者一个在其他的下面)在一起放置,并在相邻的物件间有分隔手柄。下面是创建图6.7中的窗口的代码:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit;
QTextEdit *editor2 = new QTextEdit;
QTextEdit *editor3 = new QTextEdit;
QSplitter splitter(Qt::Horizontal);
splitter.addWidget(editor1);
splitter.addWidget(editor2);
splitter.addWidget(editor3);
...
splitter.show();
return app.exec();
}
图6.7 分隔条应用程序
该登陆由3个被Qsplitter物件水平布置的QTextEdit。与布局管理器不同,它们只是简单地布置窗体的子物件但没有可见表示,而Qsplitter是继承自QWidget并能像其他任何物件一样使用。
图6.8 分隔条程序的物件
复杂的布局可通过嵌套使用水平和垂直QSplitter实现。例如,图6.9中展示的邮件客户端程序由右边包含一个垂直QSplitter的一个水平QSplitter组成。
图6.9 在Mac OS X系统上的邮件客户程序
下面是邮件客户端程序的QMainWindow的子类的构造函数代码:
MailClient::MailClient()
{
...
rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget);
rightSplitter->addWidget(textEdit);
rightSplitter->setStretchFactor(1, 1);
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1);
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
readSettings();
}
在创建了我们要显示的3个物件之后,我们创建了一个垂直分隔器rightSplitter并把要放在右侧的两个物件添加到其中。然后我们创建现代战争水平分隔器mainSplitter并把第3个放在左侧,rightSplitter放在右侧。我们使mainSplitter 成为 QMainWindow's 的中央物件。
当用户调整一个窗口的尺寸时,QSplitter正常分配空间,因此这些子物件间的相对距离仍旧不变。在邮件客户端程序例子中,我们并不想要这种行为。相反,我们希望QtreeWidget和QTableWidget保持它们的尺寸想给QTextEdit更多的额外空间。这可通过两个setStretchFactor()调用实现。第一个参数是分隔器的子物件以0为开始的索引,第二个参数是我们想设的伸长因子,它默认为0。
图6.10 邮件客户端的分隔器索引
第一个setStretchFactor()调用针对rightSplitter,它设位置为1(textEdit)物件的伸长因子为1。第二个setStretchFactor()调用针对mainSplitter,它设置位置为1(rightSplitter)物件的伸长因子为1。这保证textEdit将得到任何可用的空间。
当程序启动的时候,QSplitter根据他们的初始化尺寸给这些子物件合适的尺寸(或者如果没有指定初始化尺寸的话则根据它们的尺寸暗示)。我们可以通过调用QSplitter::setSizes()用程序移动分隔手柄。QSplitter类还提供了一种保存和在程序下次运行恢复它的状态的方法。下面是保存邮件客户端设置的writeSettings()函数:
void MailClient::writeSettings()
{
QSettings settings("Software Inc.", "Mail Client");
settings.beginGroup("mainWindow");
settings.setValue("size", size());
settings.setValue("mainSplitter", mainSplitter->saveState());
settings.setValue("rightSplitter", rightSplitter->saveState());
settings.endGroup();
}
下面是相应的readSettings()函数:
void MailClient::readSettings()
{
QSettings settings("Software Inc.", "Mail Client");
settings.beginGroup("mainWindow");
resize(settings.value("size", QSize(480, 360)).toSize());
mainSplitter->restoreState(
settings.value("mainSplitter").toByteArray());
rightSplitter->restoreState(
settings.value("rightSplitter").toByteArray());
settings.endGroup();
}
Qt设计师完全支持QSplitter。要把物件放进分隔器中,把这些子物件放置在它们期望的合适位置上,选中它们,并点击“Form|Lay Out Horizontally in Splitter“ 或者 “Form|Lay Out Vertically in Splitter“。
Submitted by liuguangzhao on Sun, 2008-07-13 20:49
QStackedLayout类布置一组物件或者“页”,并且在同一时刻仅显示其中一个,隐藏其他的。QStackedLayout本身不可见,它也不为用户的变换页操作提供内存方法。在图6.5中的小箭头和深灰色边框是Qt设计师提供的让设计时管理布局更容易些。为了方便,Qt还包括QStackedWidget,它提供了一个带有内建QStackedLayout的QWidget。
图6.5 QStackedLayout
页序号是从0开始计的。要使一个指定的子物件可见,我们可以用一个页序号为参数调用setCurrentIndex()。一个子物件的的页序号可使用indexOf()获得。
图6.6中的选项对话框是一个使用了QStackedLayout的例子。该对话框由左边的QListWidget和右边的QStackedLayout组成。在QlistWidget中的每一项对应于QStackedLayout中的不同页。下面是该对话框的构造函数相关代码:
PreferenceDialog::PreferenceDialog(QWidget *parent)
: QDialog(parent)
{
...
listWidget = new QListWidget;
listWidget->addItem(tr("Appearance"));
listWidget->addItem(tr("Web Browser"));
listWidget->addItem(tr("Mail & News"));
listWidget->addItem(tr("Advanced"));
stackedLayout = new QStackedLayout;
stackedLayout->addWidget(appearancePage);
stackedLayout->addWidget(webBrowserPage);
stackedLayout->addWidget(mailAndNewsPage);
stackedLayout->addWidget(advancedPage);
connect(listWidget, SIGNAL(currentRowChanged(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
...
listWidget->setCurrentRow(0);
}
图6.6 选项对话框的两个页
我们创建了一个QListWidget并用页名字放在它里面。然后我们创建了一个QStackedLayout并为每页调用addWidget()。我们把列表物件的currentRowChanged(int)信号连接到堆栈布局的setCurrentIndex(int)来实现页的交换,并在构造函数的结尾处理调用列表物件的setCurrentRow()把序号为0的页放在开始位置。
使用Qt设计师创建这样的窗体也非常容易:
1.基于“对话框”或者“物件”模板创建一个新的窗体。
2.向窗体添加一个QListWidget 和一个 QStackedWidget 。
3.使用子物件和布局填充每一页。
(要创建一个新页,右键点击并选择插入页,要交换页,点击QStackedWidget 右上角的左箭头或者右箭头。)
4.使用一个水平布局把这些物件靠在一起。
5.把列表物件的currentRowChanged(int)信号连接到堆栈物件的setCurrentIndex(int) 槽。
6.设置列表物件的currentRow属性的值为0。
因为我们已经使用预定义的信号和槽实现了页之间的交换,在Qt设计师中预览该对话框将展示这一正确行为。
Submitted by liuguangzhao on Sun, 2008-07-13 20:45
有三种管理窗体上的子物件的布局的方法:绝对位置,手工布局和布局管理器。我们将依次看看每种方法,使用图6.1中的“Find File “对话框作为例子。
图6.1 文件查找对话框
绝对位置法是布置物件的最让人讨厌的。它通过硬编码窗体上子物件的尺寸和位置以及固定尺寸的窗体。在上面是使用了绝对位置法的FindFileDialog构造函数:
FindFileDialog::FindFileDialog(QWidget *parent)
: QDialog(parent)
{
...
namedLabel->setGeometry(9, 9, 50, 25);
namedLineEdit->setGeometry(65, 9, 200, 25);
lookInLabel->setGeometry(9, 40, 50, 25);
lookInLineEdit->setGeometry(65, 40, 200, 25);
subfoldersCheckBox->setGeometry(9, 71, 256, 23);
tableWidget->setGeometry(9, 100, 256, 100);
messageLabel->setGeometry(9, 206, 256, 25);
findButton->setGeometry(271, 9, 85, 32);
stopButton->setGeometry(271, 47, 85, 32);
closeButton->setGeometry(271, 84, 85, 32);
helpButton->setGeometry(271, 199, 85, 32);
setWindowTitle(tr("Find Files or Folders"));
setFixedSize(365, 240);
}
绝对位置法有许多的缺点:
用户不能调整窗口的尺寸。
如果用户选择了非同寻常的大字体或者程序程序被翻译为另一种语言,可能一些文本会被截断。
物件可能对某些风格有不适当的尺寸。
位置和尺寸必须要手工计算出来,这是非常乏味的,容易出错的,让人感觉非常的痛苦。
绝对位置法的一个替代是人工布局。使用人工布局,物件依旧被给定绝对位置,但它们的尺寸可自动适应窗口的尺寸而不必都进行硬编码。这可通过重新实现窗体的resize()函数设置它的子物件的几何参数:
FindFileDialog::FindFileDialog(QWidget *parent)
: QDialog(parent)
{
...
setMinimumSize(265, 190);
resize(365, 240);
}
void FindFileDialog::resizeEvent(QResizeEvent * /* event */)
{
int extraWidth = width() - minimumWidth();
int extraHeight = height() - minimumHeight();
namedLabel->setGeometry(9, 9, 50, 25);
namedLineEdit->setGeometry(65, 9, 100 + extraWidth, 25);
lookInLabel->setGeometry(9, 40, 50, 25);
lookInLineEdit->setGeometry(65, 40, 100 + extraWidth, 25);
subfoldersCheckBox->setGeometry(9, 71, 156 + extraWidth, 23);
tableWidget->setGeometry(9, 100, 156 + extraWidth,
50 + extraHeight);
messageLabel->setGeometry(9, 156 + extraHeight, 156 + extraWidth,
25);
findButton->setGeometry(171 + extraWidth, 9, 85, 32);
stopButton->setGeometry(171 + extraWidth, 47, 85, 32);
closeButton->setGeometry(171 + extraWidth, 84, 85, 32);
helpButton->setGeometry(171 + extraWidth, 149 + extraHeight, 85,
32);
}
在FindFileDialog的构造函数中,我们设置窗体的最小尺寸为266x190,设置初始化尺寸为365x240。在resizeEvent()处理函数中,我们要给物件所有额外的空间以便能增长它的尺寸。这可保证当用户调整它的尺寸时窗体能平滑缩放。
图6.2 调整一个可调整大小的对话框
就像绝对位置法一样,人工布局需要程序员计算许多硬编码常量。这样的编码是烦人的,物件是在设置改变了的时候。并且这还是可能文本被截断的风险。我们可以通过充分利用子物件的尺寸暗示避免此风险,但这很可能使编码更加复杂。
布置窗体上的物件的最方便的解决方法是使用Qt的布局管理器。布局管理器为物件的每种类型都提供了很明智的默认行为并且充分利用了每个物件的尺寸暗示,它们一般都依赖于物件的字体,风格和内容。布局管理器还会考虑最小和最大的尺寸,并能自动调用负责字体改变、内容变化和窗口尺寸变化的布局。
最重要的3种布局管理器是QHBoxLayout, QVBoxLayout, 和 QGridLayout。这些类继承自QLayout,它为布局提供了基本的框架。Qt Designer完全所有这3个类,并且也能直接在代码中使用。
下面的FindFileDialog代码使用了布局管理器:
FindFileDialog::FindFileDialog(QWidget *parent)
: QDialog(parent)
{
...
QGridLayout *leftLayout = new QGridLayout;
leftLayout->addWidget(namedLabel, 0, 0);
leftLayout->addWidget(namedLineEdit, 0, 1);
leftLayout->addWidget(lookInLabel, 1, 0);
leftLayout->addWidget(lookInLineEdit, 1, 1);
leftLayout->addWidget(subfoldersCheckBox, 2, 0, 1, 2);
leftLayout->addWidget(tableWidget, 3, 0, 1, 2);
leftLayout->addWidget(messageLabel, 4, 0, 1, 2);
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(stopButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();
rightLayout->addWidget(helpButton);
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);
setWindowTitle(tr("Find Files or Folders"));
}
该布局使用了一个QHBoxLayout, 一个QGridLayout, 和 一个 QVBoxLayout来处理。左边的QgridLayout和右边的QVBoxLayout并排在一起放置在外面的QHBoxLayout中。对话框周围的边距和子物件间的空间被设置为基于当前物件风格类型的默认值。它们可通过QLayout::setMargin() 和 QLayout::setSpacing()来改变。
在Qt设计师中可以可视化地把子物件放置到它们合适的位置来创建出相同的方法。选中需要布置的物件,再点击网格中的“Form|Lay Out Horizontally“,”Form|Lay Out Vertically“, 或” Form|Lay Out“ 。我们曾在第2章中使用这种方法创建Spreadsheet程序的”转到单元格“和排序对话框。
图6.3 文件查找对话框的布局
QHBoxLayout 和 QVBoxLayout的使用非常的直接,但QgridLayout的使用有那一点复杂。QgridLayout工作于一个二维网关单元格。在布局左上角的QLabel的位置为(0,0),对应的QlineEdit位置为(0,1)。QcheckBox跨越了两列,它占据了位置为(2,0)和(2,1)的单元格。QtreeWidget和它下面的QLabel也跨越了两列。addWidget()调用的讲法如下所示:
layout->addWidget(widget, row, column, rowSpan, columnSpan);
这里widget是要插入到布局中的子物件,(row,column)是被该物件占据的左上角单元格,rowSpan是该物件占据的行数,columnSpan是该物件占据的列数。如果被忽略了,rowSpan和columnSpan参数默认设为1。
addStretch()调用告诉布局管理器用尽该布局中此处的空间。通过添加一个伸缩项,我们就等于告诉了布局管理器在”Close”按钮和”Help”按钮间放置一个足够大的空间。在Qt设计师中,我们可以通过插入一个间隔生成物件。Qt设计师中的间隔生成物件显示为一个绿色的“弹簧“。
布局管理器还提供了我们现在为止还没有涉及的优点。如果我们向布局添加一个物件到或者从布局中删除一个物件,布局会自动适应新的情况。如果我们调用一个子物件的hide()或show()情况也一样。如果一个子物件的尺寸暗示改变了,该布局会自动重做,并充分利用新的尺寸暗示。并且布局管理器还能自动根据窗体的子物件的最小尺寸和尺寸暗示设置整个窗体的最小尺寸。
在前面看到的例子中,我们只是简单的把物件放到布局中并使用间隔生成器(伸缩器)来占据所有多余空间。在某些情况下,这并不能有效的得到我们所需类型的布局。这些情况下,我们可以通过改变要布置的物件的尺寸策略和尺寸暗示调用该布局。
物件的尺寸策略告诉布局管理系统它是否能被拉伸或者缩放。Qt为它的所有内建物件提供了明智的默认尺寸策略,但因为没有单个的默认值无法解释每种可能的布局,对开发者来说依旧需要为窗体上的一两个物件改变它们的尺寸策略。QsizePolicy兼有水平和垂直组件。下面是它的最有用的值:
Fixed 意味着物件不能伸长或者缩小。物件总是坚持它的尺寸暗示的值。
Minimum 意味着物件的尺寸暗示是它的最小值。物件不能缩小到低于尺寸暗示的值,但必要的话它能伸长以填充可用空间。
Maximum 意味着物件的尺寸暗示是它的最大尺寸。物件可以被缩小到它的最小尺寸暗示值。
Preferred 意味着物件的尺寸暗示是它的首选值,但必要的话物件能缩小或者伸长。
Expanding 意味着物件能缩小或者伸长并且它将优先伸长。
图6.4 总结了不同尺寸策略意义,并使用显示文本"Some Text" 的QLabel作为例子。
图6.4 不同尺寸策略的意义
在图中,Preferred 和 Expanding以相同的方式描述的。那么不同之处是什么呢?当一个包含Preferred 和 Expanding 两种类型的物件的窗体都被调整大小的时候,额外的空间给了Expanding的物件,而Preferred的物件坚持它们的尺寸暗示。
还有其他两种尺寸策略:MinimumExpanding 和 Ignored。前都在Qt的老版本中一些罕见的情况下有必要,但它不再被使用了。更好的方法是使用Expanding并重新实现适当的minimumSizeHint()。后者与Expanding类似,但它忽略了物件尺寸暗示和最小尺寸暗示。
除了尺寸策略的水平和垂直组件,QsizePolicy类还存储了水平和垂直伸缩因子。这些伸缩因子可被用于表示在窗体扩展的时候不同的子物件应该以不同的速率伸长。例如,如果我们在QTextEdit上面有一个QtreeWidget并且我们希望QTextEdit应该是QtreeWidget的两倍高,那么我们可以把QTextEdit的垂直伸长因子设为2并把QtreeWidget's的垂直伸缩因子设为1。
然而其他影响布局的方法有设置子物件的最小尺寸,最大尺寸或者固定尺寸。布局管理器将会在布置这些物件的时候充分考虑这些常量。并且如果这还不够的话,我们还可从子物件类继承并重新实现sizeHint()来获得我们需要的尺寸暗示。
Submitted by liuguangzhao on Sun, 2008-07-13 20:43
布局窗体上的物件
堆栈布局
分隔条
滚动区域
停靠物件和工具栏
多文档界面
每个放在窗体上的物件都必须给它一个合适的尺寸和位置。Qt提供了几个布置窗体上的物件的类:QHBoxLayout, QVBoxLayout, QGridLayout, 和 QstackLayout。这些类是如此简单以至于几乎每个Qt开发人员都使用它们,或者直接在源代码中使用或者通过Qt设计师。
另一个使用Qt的布局系统的原因是它们能保证窗体自动适应不同的字体,语言和平台。如果用户改变了系统的字体设置,程序的窗体将会立即响应,如果有必要的话调整他们的尺寸。
其他能执行布局管理的类包括QSplitter, QScrollArea, QMainWindow, 和 QWorkspace。这些类莫须有的特点是他们都提供了能让用户控制的简单布局。例如,Qsplitter提供了一个能让用户拖动物件的尺寸的分隔条,Qworkspace提供了对MDI(多文档界面)的支持,意思是在一个程序的主窗口能同时显示许多的文档窗口。因为它们经常用于替代来合适的布局类,它们将在本章详细阐述
Submitted by liuguangzhao on Sat, 2008-07-12 23:01
- 数组中可用的数据类型,array-element-type
(unsigned-byte 2) (unsigned-byte 4) (unsigned-byte 8) (unsigned-byte 16) (unsigned-byte 32)
bit charactor nil
- 构造数组
make-array 函数。构造一个新的数组,构造时可指定数组的维数,数据类型,初始化值。
adjust-array 函数。调整一个已有的数组,修改数组的维数,数据类型,值。
- 数组的限制
| CPU 类型 |
32-位 |
64-位 |
| ARRAY-RANK-LIMIT |
2^12 = 4096 |
2^12 = 4096 |
| ARRAY-DIMENSION-LIMIT |
2^24-1 = 16777215 |
2^32-1 = 4294967295 |
| ARRAY-TOTAL-SIZE-LIMIT |
2^24-1 = 16777215 |
2^32-1 = 4294967295 |
Submitted by liuguangzhao on Fri, 2008-07-11 09:33
#include <stdlib.h>
#include <wchar.h>
int mblen(const char *s, size_t n); //计算多字节字符串占用字节数。
int mbtowc(wchar_t *pwc, const char *s, size_t n); //将多字节字转换为 UNICODE字符
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n); //将多字节字符串转换为 UNICODE字符串,结果添加null字符。
size_t wcstombs(char *s, const wchar_t *pwcs, size_t n); //
double wcstod(const wchar_t *nptr, wchar_t **endptr);
long wcstol(const wchar_t *nptr, wchar_t **endptr, int base);
unsigned long wcstoul(const wchar_t *nptr, wchar_t **endptr, int base);
Submitted by liuguangzhao on Thu, 2008-07-10 12:53
最近看《大秦帝国》一书,遇到许多不认识的字啊,且记之以自勉强。
酽
嚭 pǐ
ㄆㄧˇ
大。
古人名用字。
郑码:BJGJ,U:56AD,GBK:87BA
笔画数:19,部首:口,笔顺编号:1212514312511324251
宰嚭:即太宰嚭。本名伯嚭,系春秋时楚伯州犁之孙。楚诛伯州犁,伯嚭奔吴,吴以为大夫,后任太宰,故称太宰嚭。
嚭嚭:犹勃勃。心跳的样子。
拆开看 喜否? 高兴不?
谿
xī
同“溪”。
笔画数:17;
部首:谷;
笔顺编号:34435541343434251
谿
豀
xī
【名】
(形声。从水,奚声。本义:山沟,山谷)同本义〖gully;valley〗
谿,谷也。——《广雅》
若高山之与深谿。——《吕氏春秋·察微》。注:“无水曰谿。”
川曰谿。李注:“出于山入于川为谿也。”——《尔雅·释水·水注》
涧谿沼沚之毛。——《左传·隐公三年》。毛注:“谿亦涧也。”
不临深谿,不知地之厚也。——《荀子·劝学》
其山时露骨峥峥,然犹见谿流也。——《徐霞客游记》
又如:谿谷;谿壑
谿谷
xīgǔ
〖gully;mountainvalley〗山与山之间低陷的地方
谿壑
xīhè
〖mountaingorge〗山谷溪涧(多用于比喻人的欲念)
Submitted by liuguangzhao on Wed, 2008-07-09 21:26
1. 介绍
函数:char-code 计算一个字符的ASCII值。
函数:code-char 根据ASCII值构造一个字符。
char-code 函数的返回值范围:
binaries built without UNICODE support with UNICODE support
CHAR-CODE-LIMIT 2^8 = 256 17 * 216 = 1114112
其中CHAR-CODE-LIMIT 变量为系统定义,表示可能的ASCII极限值,但不包括这个值。
内置数据类型 EXT:STRING-CHAR 和 BASE-CHAR 都等价于 CHARACTER。
函数 EXT:CHAR-WIDTH 计算字符的宽度,即占用的字节数。
对于不占用空间的字符,返回值为 0 (像控制字符及其组合)
对于东亚又字节字符,返回值为 2
其他所有字符,返回值皆为 1
2. 特殊字符说明
标准字符及代码
character code
#\Space #x20
#\Newline #x0A
准标准字符及代码
character code
#\Backspace #x08
#\Tab #x09
#\Linefeed #x0A
#\Page #x0C
#\Return #x0D
附加的命名字符及代码
character code
#\Null #x00
#\Bell #x07
#\Escape #x1B
附加的从 #x00 到 #x1F 的字符 ASCII码
#\^@ #x00
#\^A … #\^Z #x01 … #x1A
#\^[ #x1B
#\^\ #x1C
#\^] #x1D
#\^^ #x1E
#\^_ #x1F
3. 字符大小写
函数 EXT:CHAR-INVERTCASE 改变字符的大小写,即将大写字符变为小写,或者将小写转变为大写。
CL> (char-invertcase #\a)
#\A
CL> (char-invertcase #\A)
#\a
函数 CHAR-UPCASE 将字符转变为大写字符。如果参数为大写,则直接返回参数。
函数 CHAR-DOWNCASE 将字符转变为小写字符。如果参数为小写,则直接返回返回。
与 CHAR-INVERTCASE 对应的字符串操作函数为: STRING-INVERTCASE 和 NSTRING-INVERTCASE
CL> (string-invertcase "abcd")
"ABCD"
CL> (string-invertcase "AbCd")
"aBcD"
4. 字符的大小顺序,字符排序规则
字符是通过其 UNICODE 代码值排序的。
字符大小比较函数 CHAR-EQUAL CHAR-NOT-EQUAL, CHAR-LESSP, CHAR-GREATERP, CHAR-NOT-GREATERP, CHAR-NOT-LESSP
这几个函数是不考虑字符的控制位的。
5. 回车与换行字符的输入与输出
回车符、换行符 是平台相关的,在各种不同的平台表现不尽相同。
win32 {
写的时候 换行字符#\Newline变成CR/LF
读的时候,CR/LF转变为一个字符#\Newline
}
如果要区分CR/LF,需要使用函数 READ-BYTE
函数 READ-LINE 从文件或者流中读取一行,返回的字符串包括换行符 #\Newline
6. 字符属性
控制位属性:
系统变量 EXT:CHAR-BIT-LIMIT = 16
属性位有
key value code
:CONTROL EXT:CHAR-CONTROL-BIT 1
:META EXT:CHAR-META-BIT 2
:SUPER EXT:CHAR-SUPER-BIT 4
:HYPER EXT:CHAR-HYPER-BIT 8
函数 EXT:CHAR-BIT char name 返回字符的控制位。
函数 EXT:MAKE-CHAR char [bits] 构造带控制位的字符
函数 EXT:SET-CHAR-BIT char name new-value 设置字符的控制位
Submitted by liuguangzhao on Tue, 2008-07-08 21:13
1. 数字数据类型
NUMRER , REAL , RATIONAL, INTEGER, FLOAT
2. 数字的概念
数字计算函数:
ext:! 计算数字的阶乘
CL> (! 2)
2
CL> (! 3)
6
CL> (! 30)
265252859812191058636308480000000
EXT:EXQUO 计算两个数字的整数商,如果不能整除,则会报错。(对整除的时候,这个函数比 / 效率高)。
CL> (exquo 6 2)
3
CL> (exquo 6 5)
*** - quotient 6 / 5 is not an integer
XGCD ???没看太明白这个计算什么的。
EXT:MOD-EXPT (mod-expt k l m) 等于 (MOD (EXPT k l) m), 但对大数情况,这个函数更有效率。
浮点数相关函数:
decode-float ???
float-radix 小数位数,总是返回2
FLOAT-DIGITS number digits 将数字number强制转换为至少有digits个尾数的小数。
下面的表达式总是为 T
(>= (FLOAT-DIGITS (FLOAT-DIGITS number digits)) digits)
函数expt 计算乘方
CL> (expt 2 3)
8
CL> (expt 3 2)
9
函数log 计算log值
常量PI, 该值为LONG-FLOAT
CL> (print PI)
3.1415926535897932385L0
3.1415926535897932385L0
复数:
有一个实部,一个虚部。
得数表示为#C(实部 虚部)
CL> (sqrt -9.0)
#C(0 3.0)
使用函数complex可以构造一个得数:
CL> (complex 2 3)
#C(2 3)
随机数:
设置随机数种子,(SETQ *RANDOM-STATE* (MAKE-RANDOM-STATE T))
默认随机数种子固定, 如果不调用设置种子,则产生的随机数也固定。
生成随机数函数:random n , 生成0-n之间的随机数。
CL> (random 199)
67
CL> (random 199)
89
字节类型是内置类型BYTE,而不是INTEGER。
几个数字表示的说明:
3.1415926535897932385L0 L是什么意思?
2.23343s0 这里面的s是什么意思?
s0表示 SHORT-FLOAT
L0表示 LONG-FLOAT
d0表示 DOUBLE-FLOAT
还有一个SINGLE-FLOAT,不知如何表示。
Submitted by liuguangzhao on Sun, 2008-07-06 22:42
Gentoo Linux 2008.0 正式版本已经放出。新版本增加了许多新特性,包括:对 installer (安装程序) 进行了更新、改善了对硬件的支持、完全重做了 profiles、LiveCD 中的 GNOME 替换成了 Xfce 等。此外,该版本也更新了许多包,如 Portage 2.1.4.4、2.6.24 kernel、Xfce 4.4.2、gcc 4.1.2、glibc 2.6.1。
Gentoo Linux 2008.0 的安装 ISO 映像可从 Gentoo 官方网站下载。值得注意的是,适用于 x86 和 amd64 架构的 LiveDVD 目前暂未提供。
|
|
|
|