我想使用R从已知关系列表中生成关系矩阵.例如,使用以下数据集:
John Green
Mary Blue
Mary Red
John Blue
Run Code Online (Sandbox Code Playgroud)
我想拥有 :
Green Blue Red
John 1 1 0
Mary 0 1 1
Run Code Online (Sandbox Code Playgroud)
我没有找到如何做到这一点.提前感谢任何建议.
在Ada中,类型T的原始操作只能在定义了T的包中定义.例如,如果Vehicules
包定义Car
并Bike
标记了记录,两者都继承了一个通用的Vehicle
抽象标记类型,那么Vehicle'Class
必须在此Vehicles
包中定义除了可以在类范围类型上调度的所有操作.
假设您不想添加基本操作:您没有编辑源文件的权限,或者您不希望使用不相关的功能来混淆包.
然后,您无法在其他包中定义隐式分派类型的操作Vehicle'Class
.例如,你可能想序列车辆(定义一个Vehicles_XML
与封装To_Xml
调度功能)或显示它们作为UI元素(定义一个Vehicles_GTK
与包Get_Label
,Get_Icon
...调度功能)等来执行动态调度的唯一方法是写代码明确; 例如,里面Vechicle_XML
:
if V in Car'Class then
return Car_XML (Car (V));
else
if V in Bike'Class then
return Bike_XML (Bike (V));
else
raise Constraint_Error
with "Vehicle_XML is only defined for Car and Bike."
end if;
Run Code Online (Sandbox Code Playgroud)
(Vehicles
当然,在其他地方定义并在其他地方使用的访问者模式也可以工作,但是仍然需要相同类型的显式调度代码.编辑实际上没有,但是仍然有一些样板代码要编写)
我的问题是:
是否有理由限制在T的定义包中定义在T上动态调度的操作?
这是故意的吗?这背后有一些历史原因吗?
谢谢
编辑:
感谢您当前的答案:基本上,它似乎是语言实现的问题(冻结规则/虚拟表).
我同意编译器会随着时间的推移逐步开发,并且并非所有功能都能很好地适应现有工具.因此,在一个独特的包中隔离调度操作符似乎是一个主要由现有实现而不是语言设计引导的决策.C++/Java系列之外的其他语言提供了没有这种要求的动态调度(例如OCaml,Lisp(CLOS);如果重要的话,那些也是编译 …
我目前正在尝试定义一个函数,该函数采用列表列表,模型列为方形矩阵并返回所述矩阵的对角线.
例如,输入((a b c) (d e f) (g h i))
给出(a e i)
.
我对如何解决这个问题有一个模糊的想法(取最后一个列表的最后一个元素,然后是第二个到最后一个列表的倒数第二个元素等等),但我不确定如何编写这个方案.
如果有人能指出我正确的方向,我将不胜感激.
谢谢.
我对这种语言越来越熟悉了.但我有一个问题......我正在研究一个将温度转换为celcius或F的函数.我正在传递一个列表(50 C),然后分别处理每个案例.由于某种原因,当我这样做(等于"C"(cadr lst))我得到NIL.I打印出列表的干部,它是C.任何想法?
(defun convert-to-c(num)
(* (- num 32) 5/9)
)
(defun convert-to-f(num)
(+ (* num 9/5) 32)
)
(defun convert-temp (lst)
(cond ((equalp "C" (cadr lst)) (convert-to-f (car lst)))
(t (convert-to-c (car lst))))
)
Run Code Online (Sandbox Code Playgroud)
我正在打电话
(convert-temp '(30 C))
Run Code Online (Sandbox Code Playgroud) 我有相信Common Lisp中的语法问题.我有一个全局变量,*LOC*
我可以设置它的初始值并进行更改.我的问题不在于变量,它工作正常,当我尝试显示带有其值的消息时.
例如,当我使用if语句并说出类似的内容时:
(if ( UPSTAIRSP *LOC*)
(progn (princ "I AM UPSTAIRS IN THE *LOC*"))
(progn (princ "I AM DOWNSTAIRS IN THE *LOC*"))
)
Run Code Online (Sandbox Code Playgroud)
我会得到:
I AM UPSTAIRS IN THE *LOC*
我很确定这是因为我的变量在引号中,但我不知道如何表达它.
我是Common Lisp的初学者,遇到了这段代码:
(let ((foo (list 42)))
(setf (rest foo) foo))
Run Code Online (Sandbox Code Playgroud)
在尝试执行它时,REPL似乎永远循环.
let cond (a,b,c) =
match a with
| true -> b
| false -> c
let rec fact n =
cond (n=0,1, n * fact (n-1))
let rec fact n =
if n=0 then 1 else n * fact (n-1)
Run Code Online (Sandbox Code Playgroud)
在上面的代码段中,第一个版本给出了堆栈溢出异常,而第二个版本正常工作.这两者有什么区别?他们似乎功能相同,但显然没有.
假设我有一个清单:
((1 2 3) (8 4 7) (41 79 30) (0 8 5))
Run Code Online (Sandbox Code Playgroud)
我想做这个:
(1+8+41+0 2+4+79+8 3+7+30+5) = (50 93 45)
Run Code Online (Sandbox Code Playgroud)
我找到了一个丑陋的解决方案:
(defun nested+ (lst)
(let ((acc nil))
(dotimes (i (length (first lst)))
(push (apply #'+ (mapcar #'(lambda (a) (nth i a)) lst)) acc))
(reverse acc)))
Run Code Online (Sandbox Code Playgroud)
它似乎适用于我的目的,但我想这是缓慢而且没有lispy.什么是正确的方法?
我知道算法:
(defun Hanoi (n) (if (= n 1) 1 (+ (* 2 Hanoi(- n 1)) 1)))
Run Code Online (Sandbox Code Playgroud)
但是,CLISP 表示
*** - IF: variable HANOI has no value
Run Code Online (Sandbox Code Playgroud)
我怎么能调整这个?我查不出问题。
我想解决一个返回NUMBER(计数)数字的lisp函数,这些数字大于列表中的第一个数字.列表是一个数字的线性列表.
(defun foo (lst)
(cond ((null lst) 0)
(car = k)
((> (car lst) k)
(1+ (foo (cdr lst))))
(T (foo (cdr lst)))))
Run Code Online (Sandbox Code Playgroud)
我的问题是我不能保留第一个元素并将其与其他元素进行比较.